我已经把头撞到墙上两天了,试图找出我的代码到底出了什么问题。到目前为止,什么都没有。我发现的唯一一件事是一个对象试图对其自身调用 release 并且它还没有被实例化。(虽然,由于某种原因,它不会在 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 模型
线程做这样的事情(在自动释放池中)
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];
}
}
当我遇到崩溃时(由于某种该死的原因随机发生,我得到堆栈跟踪如下
人释放
人 setTheAge (bam crash)
我猜是因为二传手看起来像这样
-(void)setTheAge:(NSString*)theAge {
[theAge retain];
[age release]; // it doesn't exist for some reason???
age = theAge;
}
我该如何保护这种类型的东西?