Я уже два дня ударяю головой о стену, пытаясь понять, что черт не так с моим кодом. Пока ничего. Единственное, что я обнаружил, это тот факт, что объект пытается вызвать релиз сам по себе, и он еще не был создан. (хотя по какой-то причине это не происходит в 100% случаев, когда всякий раз, когда он думает)Объект выпущен слишком рано?
Позвольте мне объяснить проблему (возможно, я что-то пропускаю, надеюсь, вы, ребята, можете пролить свет на моя темнота)
Моя модель объекта
Person {
NSString *name;
NSNumber *age;
}
@property(nonatomic, retain) NSNumber* TheAge;
@property(nonatomic, retain) NSString *TheName;
Моя реализация
@synthesize TheName = name;
@synthesize TheAge = age;
+(Person*)personFromDictionary:(NSDictionary*)dic {
Person* newPerson = [[[Person alloc] init]autorelease];
newPerson.theAge = [dic objectForKey:kAge];
newPerson.theName = [dic objectForKey:kName];
return newPerson;
}
-(void)dealloc {
self.TheAge = nil;
self.TheName = nil;
}
у меня есть «коллектор поток», который считывает массив JSON с сервера, загрузка его и анализирует его в словаре. Каждая запись в словаре соответствует лицу объекта Эта нить другой класс просто с использованием модели Person
нить делает что-то вроде этого (в качестве autorelease бассейна)
NSDictionary *parsedDict = download.returnValue;
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
Person *tmpPerson = personFromDictionary
[entryDictionary setObject:tmpPerson forKey:kAge];
[pool release];
[self updateEntries:entryDictionary];
-(void)updateEntries:(NSMutableDictionary*)updatedDict {
NSArray *keys = [updatedDict allKeys];
for(NSString *key in allKeys){
Person *entry = [updatedDict valueForKey:key];
[entriesLock lock];
[currentPersonEntries setObject:entry forKey:key];
[entriesLock unlock];
}
}
Когда я получаю аварию (что происходит случайным образом по какой-то чертовой причине, я получаю трассировку стека следующим образом
людей dealloc
людей setTheAge (бАМ аварии)
Я предполагаю, потому что сеттер будет выглядеть примерно так
-(void)setTheAge:(NSString*)theAge {
[theAge retain];
[age release]; // it doesn't exist for some reason???
age = theAge;
}
Как я могу защитить против такого рода вещи?
Вы пытались удалить autorelease в Person * newPerson = [[[Person alloc] init] autorelease]; – Dhawal
Кстати, я не пробовал это на примере кода выше, но я бы сказал, что статический анализатор (shift-command-B), вероятно, создаст всевозможные предупреждения о вышеуказанном коде. Если вы просто попадаете в Objective C, предупреждения, сообщаемые статическим анализатором, могут быть очень полезными. Вы должны иметь _zero_ предупреждения от анализатора. Я думаю, что мой ответ ниже - более конструктивный ответ (вместо того, чтобы пробираться сквозь кучу предупреждений), но я просто хотел предложить вам проверить этот замечательный маленький инструмент. – Rob