سؤال

من خلال الكود التالي ، يمثل المحلل استدعاء محدد 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.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top