【发布时间】:2009-12-31 15:00:21
【问题描述】:
我无法理解为什么释放我刚刚创建的对象会导致我的应用程序出现内存访问错误。
我正在创建一堆对象并将它们添加到 NSMutableArray。将它们添加到数组后,我释放它们。该功能第一次运行时,一切顺利。该函数第二次运行时,释放对象会使应用程序崩溃,我不知道为什么。
这里是有问题的函数的一部分(完整的项目源代码在这里:http://github.com/cpjolicoeur/echowaves-notifier-osx)
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
[connection release];
NSString *responseString = [[NSString alloc] initWithData:echowaves.responseData encoding:NSUTF8StringEncoding];
[echowaves.responseData release];
...more code...
[[echowaves updatedConvos] removeAllObjects];
NSDictionary *dictionary = [responseString JSONValue];
if ( [dictionary count] ) {
for (NSDictionary *subscription in dictionary ) {
UpdatedConvo *convo = [[UpdatedConvo alloc] initWithConvoName:[[subscription objectForKey:@"subscription"] objectForKey:@"convo_name"]
convoURI:[[subscription objectForKey:@"subscription"] objectForKey:@"conversation_id"]
unreadCount:[[[subscription objectForKey:@"subscription"] objectForKey:@"new_messages_count"] integerValue]];
[[echowaves updatedConvos] addObject:convo];
[convo release]; // THIS LINE CAUSES CRASH 2ND TIME THROUGH
}
} else {
...more code....
}
}
应用程序通过该函数第二次在[convo release] 行崩溃。由于 convo 对象是在它之前的两行创建的,我不知道为什么。
我的印象是UpdatedConvo *convo = [[UpdatedConvo alloc] initWithConvoName...] 调用将创建对象并将其保留计数为 1。然后当我将对象添加到 [echowaves updatedConvos] NSMutableArray 对象时,它应该将保留计数增加 1 (现在计数为 2)。我已经完成了那个“临时”convo 对象,所以我然后释放它,这应该将它的保留计数移回 1,对吗??
我在这里错过了什么?
要让应用程序成功运行,我必须注释掉 [convo release] 行。不过我不知道为什么,我觉得这可能给我带来了缓慢的内存泄漏,因为新创建的 UpdatedConvo 对象没有正确地从内存中释放出来。
【问题讨论】:
标签: objective-c memory-management memory-leaks