Случайное управление памятью iOS

По какой-то причине в моем NSLogging массив replies – это NSLogging правильное описание, но массив NSLoggingNSLogging null.

Я сразу же предположил, что это связано с проблемой управления памятью в моем коде, но я не верю, что это правда.

Пожалуйста, скажите мне, почему это происходит?

 - (TBComment *) dictionaryToComment:(NSDictionary *)dict { TBComment *comment = [[TBComment alloc] init]; [comment setBody:[dict objectForKey:@"body"]]; [comment setCommentID:[dict objectForKey:@"id"]]; [comment setCreated_at:[dict objectForKey:@"created_at"]]; [comment setUpdated_at:[dict objectForKey:@"updated_at"]]; [comment setUser:[self dictionaryToUser:[dict objectForKey:@"user"]]]; NSMutableArray *replies = nil; if ([[dict allKeys] containsObject:@"replies"]) { replies = [[NSMutableArray alloc] init]; for (NSDictionary *reply in [dict objectForKey:@"replies"]) { NSLog(@"in"); [replies addObject:[self dictionaryToComment:reply]]; } } if (replies != nil) { [comment setReplies:replies]; NSLog(@"COMMENT REPLIES = %@", comment.replies); NSLog(@"REPLIES = %@", replies); [replies release]; } return [comment autorelease]; } 

Консоль ->

 2011-11-30 21:25:14.980 Timbrr[2379:f803] in 2011-11-30 21:25:14.980 Timbrr[2379:f803] COMMENT REPLIES = (null) 2011-11-30 21:25:14.980 Timbrr[2379:f803] REPLIES = ( "<TBComment: 0x68dbeb0>" ) - (void) setReplies:(NSArray *)_replies { hasReplies = (_replies == nil ? NO : ([_replies count] == 0 ? NO : YES)); //replies is synthesised } 

Я бы заподозрил, что любой comment равен nil (хотя для этого потребуется явно nil код в TBComment , что возможно, но необычно), или что -replies или -setReplies: неправильно реализованы. У вас есть пользовательские реализации для них?

Ваша реализация setReplies: никогда не устанавливает _replies .

После просмотра вашей реализации setReplies: я не думаю, что вы прекрасно понимаете, как работает @synthesize .

@synthesize replies; будет генерировать геттер и сеттер для этой переменной экземпляра. НО, поскольку вы переопределяете его (и ненадлежащим образом), синтезированный сеттер отбрасывается в сторону. (На самом деле, никакой сеттер не создается для вас вообще, поскольку вы написали его сами).

Корневая проблема заключается в том, что в вашей реализации setReplies: вы фактически не назначаете значение переменной экземпляра setReplies: параметру setter.

Я думаю, что вы хотите:

 - (void) setReplies:(NSArray *)_replies { hasReplies = (_replies == nil ? NO : ([_replies count] == 0 ? NO : YES)); // How is your ivar defined in the header file? As _replies, or replies? if (replies != _replies) { [replies release]; replies = [_replies retain]; } } 

Свойство setReplies: никогда не устанавливается – когда вы определяете setReplies: @synthesize директива @synthesize не создает никакого метода setter.

  • GCD / Блоки без утечки ARC
  • Почему и когда нам нужно использовать @autoreleasepool в проектах ios
  • Отладка EXC_BAD_ACCESS - Objective-C - Xcode 8.0
  • Как выпустить IBOutlet, определенный как свойство?
  • Приложение iphone терпит крах из-за давления памяти
  • Управление памятью с ошибкой ARC
  • Профиль инструментов, чтобы просмотреть счетчик хранения объекта
  • Почему значение count count становится 3 после выделения вида и добавления его в другое представление?
  • Возвращаемый объект Objective-C с атрибутом Core Foundation
  • Как обнаружить двойное свободное устройство?
  • Разработка iOS: Как я неправильно понимаю память в этом коде?
  • Давайте будем гением компьютера.