当我在启用了僵尸的xcode 4.5.1(LLDB)调试器中运行我的应用程序(不使用ARC)时,我在调用时遇到此错误两次(2) - [super dealloc]( - [NSObject dealloc] ):
* - [V2APIClient class]:发送到解除分配的实例0x9d865c0的消息 * - [V2APIClient class]:发送到解除分配的实例0x9d865c0的消息
当我在xcode 4.4.1(LLDB)调试器中运行相同的应用程序时,我收到错误消息一次(1)。 当我在XCode 4.3.2中运行相同应用程序的稍早版本时,我根本没有收到错误消息(0)。我将使用相同/最新的代码重试此内容。
仅供参考 - 这似乎与其他帖子完全相同,但尚未得到答复: -[Foo class]: message sent to deallocated instance on [super dealloc])
我试图避免两次重复发布同一个问题,但我建议继续: https://meta.stackexchange.com/questions/152226/avoiding-asking-a-question-thats-already-been-asked
另外,我还问过Apple Developer Forums中的同等问题: https://devforums.apple.com/thread/171282
最后,这是我班级的精髓:
@interface ASIHTTPRequestHandler : NSObject {
id _error;
}
@property (nonatomic,retain) id error;
@end
@implementation ASIHTTPRequestHandler
@synthesize error = _error;
-(id)init
{
self = [super init];
if (self)
{
self.error = nil;
}
return self;
}
-(void)dealloc
{
self.error = nil;
[super dealloc];// this is the line that appears to cause the problems
}
@end
请帮我解决这个问题。 我不相信我违反了任何内存管理规则,但这个错误似乎暗示不然。在解决这个问题之前,我对检查任何新代码犹豫不决。
谢谢, 卡盘
P.S。对于记录,这是调用代码:
PanoTourMgrAppDelegate *ptmAppDlgt = [PanoTourMgrAppDelegate getApplicationDelegate];
Settings *settings = ptmAppDlgt.settings;
Identification *identification = ptmAppDlgt.identification;
V2APIClient *v2ApiClient = [[V2APIClient alloc] initWithSettings:settings identification:identification];
NSDictionary *result = [v2ApiClient get_application_status];
BOOL success = [v2ApiClient callWasSuccessful:result];
if (!success)
{
id error = v2ApiClient.error;
NSString *mbTitle = nil;
NSString *mbMessage=nil;
if ([error isKindOfClass:[NSString class]])
{
mbTitle = @"Application version no longer suppported";
mbMessage = (NSString*)error;
[MessageBox showWithTitle:mbTitle message:mbMessage];
}
}
[v2ApiClient release]; // This is the line that indirectly causes the messages above
答案 0 :(得分:3)
如果您正在发送已解除分配的实例,那是因为您没有正确管理内存。你有一个不被保留平衡的释放;过度释放。
首先,对代码进行“构建和分析”。修复发现的任何问题。
接下来,在启用了僵尸检测的仪器下运行并打开参考计数跟踪功能。然后,当它崩溃时,检查所有保留/释放事件到相关对象。你会发现一个额外的版本。挑战是将保留放在正确的位置以平衡释放。
(正如Rob正确指出的那样,这可能仅仅是一次额外的释放调用。)
答案 1 :(得分:1)
在某些版本的Xcode中,这是调试器中的错误。
我刚刚在Xcode 4.4.1中使用它,但它不在Xcode 4.6中。为了解决这个问题,我创建了一个新的“单视图应用程序”项目,在方案对话框中打开“启用僵尸对象”,并在视图控制器中运行以下代码,并在最后一行设置断点。
- (void)viewDidLoad {
[super viewDidLoad];
NSObject *object = [[NSObject alloc] init];
[object release];
}
这会在调试器中产生以下消息:
- [NSObject类]:发送到解除分配的实例0x6a7e330的消息
您还可以看到调试器的变量部分中的对象现在将其类描述为_NSZombie_
。如果删除断点,则不再显示该消息。在正确释放对象后,调试器将调用class
方法。