Как защитить объекты от авто-релиза? - PullRequest
0 голосов
/ 23 марта 2011

Наконец-то управление памятью target-c поймало меня. Я борюсь с проблемой сейчас в течение 2 дней. Я новичок в Objective C и не могу решить проблему самостоятельно. Похоже, я неосознанно переусердствовал с Объектом. Если я делаю анализ зомби, я получаю «Сообщение Objective-C было отправлено на освобожденный объект ..»

Это важная часть журнала анализа, я думаю: Последняя строка с RefCt -1 показывает, что ответственный абонент - [XClass dataset]

набор данных - это NSDictionary, который я использую для хранения данных каждого объекта. Я использую словарь в двух внешних классах, используя 2 метода XClass ("updateDictionary:" и "dict:")

Объявление файла:

XClass.h:  
...  
NSDictionary* dataset;    
...  
@property (retain) NSDictionary *dataset;  
- (id)initWithDeviceValue:(NSDictionary*)DataSet  
- (void) updateDictionary:(NSDictionary *)dict;
- (NSDictionary *)dict;
XClass.m:

@synthesize dataset;  

-(id)initWithDeviceValue:(NSDictionary*)DataSet{  
..  
if (self = [super init])  
{  
      dataset = DataSet;}  
}  
return self;  
}    
- (void) updateDictionary:(NSDictionary *)dict{  
    dataset=[NSDictionary dictionaryWithDictionary:dict];  
}  

-(NSDictionary *)dict{  
    return dataset;  
}  

Первый метод extern, вызывающий функцию (dict :), получает правильный словарь. Вторая функция не получает словарь, потому что она, кажется, выпущена!

Как я уже сказал, последняя строка журнала зомби:

Маллок: Зомби RefCt: -1 Ответственный вызывающий абонент - [XClass dataset]

Прежние интересные строки:

Строка 2 Зомбилога:

Malloc: CFRetain RefCt: 2 Ответственный абонент: - [набор данных XClass]

Строка 3 Zombielog:

Malloc: Авто-релиз RefCt: пусто Ответственный абонент: - [XClass набор данных]

Кажется, словарь моего объекта был выпущен автоматически. Может быть, потому что он имел RefCt (сохранить счет?) 2, который был слишком много и поэтому был автоматически выпущен? Как я могу предотвратить автоматическое освобождение объектов?

Ответы [ 2 ]

3 голосов
/ 23 марта 2011

XClass.m: попробуй это ...

@synthesize dataset;  

-(id)initWithDeviceValue:(NSDictionary*)DataSet{  
    ..  
    if (self = [super init])  
    {  
          self.dataset = DataSet;
    }  
    return self;  
}    
- (void) updateDictionary:(NSDictionary *)dict{  
    self.dataset=[NSDictionary dictionaryWithDictionary:dict];  
}  

-(NSDictionary *)dict{  
    return dataset;  
}  
0 голосов
/ 24 марта 2011

@pawan.mangal Проблема решена!Это все о старом добром retainCount.Когда я инициализирую новые Объекты из Xclass, мне нужно добавить сохранение типа [code][[XClass objectx]retain][/code], чтобы сохранить его для более чем одного запроса.Также я удалил оба метода из класса и позволил синхронизированным геттерам и сеттерам сделать работу.RetainCount объекта уменьшается на 1 каждый раз, когда я использую его автоматически сгенерированный метод доступа (в данном случае - метод получения).Правильно?

...