سؤال

لقد بدأت أفهم إدارة الذاكرة بشكل أفضل في الهدف ج، ولكن هناك شيء لا أفهمه.هذا هو إعلان الملكية:

@property (nonatomic, retain)UILabel *myLabel;

وهذا هو أداة الضبط المركبة غير المرئية (على ما أظن):

- (void)setMyLabel:(UILabel *)newValue {
    if(myLabel != newValue) {
        [myLabel release];
        myLabel = [newValue retain];
    }
}

مما يوفر عليك كل أعمال الاحتفاظ والأشياء في كل مرة، ولكن لنفترض أنني قمت بتعيين الممتلكات الخاصة بي لأول مرة، ولم يتم تخصيصها بعد، لذا فإن العدد المرجعي لها هو 0، أليس كذلك؟وانا كذلك

UILabel *tempLabel = [[UILabel alloc] init];
self.myLabel = tempLabel;
[tempLabel release];

لست متأكدًا حقًا مما يحدث هناك، عندما لا يُصدر شيئًا، ولكن لنفترض أن الخاصية لها قيمة بالفعل، وقمنا بتعيينها.في أداة الضبط، يتم إصداره أولاً.إذن ألا يجعل ذلك يختفي؟إذا كان العدد المرجعي الخاص بها هو واحد، ثم تم إصداره في جهاز الضبط، فكيف يبقى موجودًا ليتم تعيينه على القيمة الجديدة المحتفظ بها؟

شكرًا!!

هل كانت مفيدة؟

المحلول

أعتقد أنك تخلط بين الأشياء والمراجع.الخاصية هي إشارة إلى كائن، وليس الكائن نفسه.عندما تقوم بتعيين أو إلغاء تعيين خاصية ما، فإنها ترسل عمليات احتجاز وإصدارات إلى الكائنات التي تشير إليها، ولكن المرجع نفسه هو جزء من الكائن الذي توجد به الخاصية (في هذه الحالة ذاتيًا).

قد يكون من المفيد قراءة أشياء مثل مؤشرات و lvalues.

نصائح أخرى

القيمة الأولية لـ myLabel هي صفر، لذا فإن مهمتك الأولى للخاصية، على سبيل المثال

self.myLabel = tempLabel;

سوف يطلق سراح لا شيء، أي [إصدار لا شيء].في Objective C، يعد إرسال رسالة إلى nil أمرًا محظورًا، لذلك لن يؤدي هذا إلى أي شيء.

وبالمثل، في طريقة Dealloc الخاصة بك، يجب أن يكون لديك:

[myLabel release];

والذي سيحرر myLabel إذا تم تعيين الخاصية، مما يؤدي إلى موازنة [الاحتفاظ بالقيمة الجديدة] في جهاز الإعداد.إذا لم يتم تعيين الخاصية مطلقًا، فستظل صفرًا، ومرة ​​أخرى سيكون [الإصدار الصفري] أمرًا محظورًا.

إقرأ ال قواعد إدارة الذاكرة للحصول على القواعد الدقيقة بشأن الوقت الذي تحتاج فيه إلى الاحتفاظ/تحرير الكائنات.

سوف "يختفي" الكائن (على سبيل المثال، سيتم إلغاء تخصيصه) عندما يتم التنازل عن كافة ملكياته.أي عندما (أو بعد فترة وجيزة) تمت موازنة جميع مكالمات التخصيص/النسخ/الجديدة مع مكالمات الإصدار/الإصدار التلقائي.

وأنا جديدة نسبيا بالهدف-C أيضا، ولكن أود أن محاولة للإجابة على هذا لإعادة التأكيد على فهمي.

<اقتباس فقرة>   

ويقول أنا وضعت ممتلكاتي لأول مرة، لم المخصصة لها ذلك بعد عدد مرجعها هو 0، أليس كذلك؟

نعم، والاحتفاظ العد 0.

<اقتباس فقرة>   

في واضع، أولا يحصل على إصدارها. حتى لا أن تجعل من تختفي؟

ووينقص 1 من الاحتفاظ عدد من myLabel. إذا كان الاحتفاظ عدد من myLabel يصل 0، البيانات أو الكائن الذي المتغير myLabel يشير ستتحرر لمن الذاكرة.

<اقتباس فقرة>   

إذا به عدد مرجع واحد، ومن ثم في واضع الذي صدر، وكيف لا يبقى حول لتعيين القيمة الجديدة احتفظت؟

في هذا السيناريو، myLabel البيانات يشير إلى ستتحرر (الإبقاء على عدد سيكون 0) وسوف myLabel ثم يشير إلى لا شيء (انها فارغة). يتم تعيين المتغير في فئة وسوف تكون متاحة دائما لقبول رسائل لذلك اضع، لذلك يمكن تعيين البيانات الجديدة إلى myLabel سواء في myLabel تحتفظ العد 0 أو 100.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top