يمثل المحلل تسربًا محتملًا لهذا البناء
-
25-09-2019 - |
سؤال
من خلال الكود التالي ، يمثل المحلل استدعاء محدد SetMyDict كتسرب محتمل وفي Dealloc ينص على أن "انخفاض غير صحيح للعدد المرجعي ليس مملوكًا في هذه المرحلة من قبل المتصل"
- (id)init {
if (self = [super init]) {
[self setMyDict:[[NSMutableDictionary alloc] init]];
}
return self;
}
- (void)dealloc {
[[self myDict] release];
[super dealloc];
}
@synthesize myDict = _myDict;
انا لا افهم هذا. اعتقدت ، أنه مع init init ، يزيد الكائن من العد الاحتفاظ بواحد ويتم تخزين المؤشر في _mydict من خلال الخاصية المتوافقة. إذا استخدمت هذا الرمز بدلاً من ذلك
- (id)init {
if (self = [super init]) {
_myDict = [[NSMutableDictionary alloc] init];
}
return self;
}
- (void)dealloc {
[_myDict release];
[super dealloc];
}
المحلل لا يشكو. ماذا ينقصني؟
المحلول
يوفر لك synthesize مجموعة و getter للكائن الذي تقوم بتوليفه.
تبدو طريقة Setter شيئًا من هذا القبيل (مأخوذة من مستندات Apple)
-(void)setMyDict:(NSMutableDictionary *)newDict {
if (myDict != newDict) {
[myDict release];
myDict = [newDict retain];
}
}
أنت تقوم بإنشاء تسرب عندما تفعل:
[self setMyDict:[[NSMutableDictionary alloc] init]];
لأنك لا تصدر القاموس المخصص حديثًا.
طريقة للعمل حول هذا:
NSMutableDictionary * dict = [[NSMutableDictionary alloc] init];
[self setMyDict:dict];
[dict release];
هذا يعتني بالتسرب.
في طريقة Dealloc ، يجب عليك استخدام:
[myDict release]; // Or whatever your property is called.
لا تنتمي إلى StackOverflow