سؤال

أحاول أن أفهم ما يحدث في الرسالة أدناه، وهذا ما أفهمه حتى الآن:

(1) يقوم المُحضر بإرجاع مؤشر إلى كائن NSString.(2) يتم الاحتفاظ بكائن NSString، ربما لأننا قمنا للتو بإعطاء مؤشر إليه.(3) الإصدار التلقائي؟متى يتم تنشيط ذلك، عندما يتم إلغاء تخصيص (إصدار) مثيل PlanetClass؟

// CLASS
@interface PlanetClass : NSObject {
        NSString *planetName;
}
- (NSString *)planetName;
- (void)setPlanetName:(NSString *)value;
@end

// GETTER
- (NSString *)planetName{
        return[[planetName retain] autorelease];
}

يحرر:أعتقد أنني في حيرة أكبر بشأن سبب الاحتفاظ الفعلي والإصدار لاحقًا.ما أفهمه هو أن المُحصل ببساطة أعاد المؤشر إلى لا شيء أو إلى كائن موجود بالفعل (أي.تم تعيينه بواسطة أداة الضبط) أعتقد أنني أفهم الاحتفاظ لأننا نتخلى عن المؤشر ونحتاج إلى تتبع ذلك، ولكن ماذا عن الإصدار، هل هذا مجرد إجراء آمن من الفشل في حالة نسيان تحرير كائن NSString لاحقًا؟

يتم أيضًا إصدار متغير المثيل PlanetName في طريقة Dealloc الخاصة بي (انظر أدناه)، ويبدو أن الإصدار التلقائي يفعل الشيء نفسه، فقط في وقت لاحق عندما يتم استنزاف المجمع؟

- (void)dealloc {
        [planetName release];
        [super dealloc];
}

هتاف -غاري-

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

المحلول

قد تكون فكرة جيدة السماح لـ Objective-C بالتعامل مع هذا كخاصية، مما يسمح لك بتنظيف بعض التطبيقات للحفاظ على إدارة الذاكرة، بشكل جيد، ويمكن التحكم فيها:

@interface PlanetClass : NSObject {
    NSString* planetName;
}
@property(nonatomic, retain) NSString* planetName;
@end // PlanetClass

@implementation PlanetClass
@synthesize planetName
//... rest of PlanetClass here
@end // PlanetClass

هناك كثير ل مستندات متاح متصل لمزيد من التفاصيل حول خصائص Objective-C و @synthesize.

وثائق إدارة الذاكرة

أنصح بشدة هذه القراءة من Apple حول إدارة الذاكرة في محاولة للمساعدة في فهم ما كل retain/release هرج ومرج حول.

نصائح أخرى

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

وعودة / autorelease في طريقة جالبة لا تفعل أي شيء، يمكنك فقط العودة planetName

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