iPhone - 向解除分配的实例发送消息 - 为什么?

时间:2010-12-05 22:06:44

标签: iphone cocoa-touch debugging

我一直在犯这个错误,我只是不明白为什么。我是新手,所以也许有人可以指出问题。

错误:

-[ShareXML release]: message sent to deallocated instance

代码:

if(self.share){
        NSLog(@"SHARE ALREADY EXISTS");
        [self.share startSomeProcess];
    }else{
        NSLog(@"share xml");
        ShareXML *shareXML = [[ShareXML alloc] init];
        self.share = shareXML;
        self.share.delegate = self;
        [self.share startSomeProcess];
        NSLog(@"SHARE XML RELEASED");
        [shareXML release];
}

ShareXML是一个NSObject。我在视图控制器上使用几乎相同的代码,它可以工作。 谢谢!

4 个答案:

答案 0 :(得分:1)

要查找发送到解除分配实例的消息的位置,请按照on CocoaDev所述设置环境变量NSZombieEnabled。

为了让编译器找到错误的机会很大,请进行分析器构建。它位于Build菜单中,“Build and Analyze”,或者你可以点击shift-ctrl-A。

如果您确切地确定了问题的位置,那么它可能会很明显,但您可以发布更多代码。

答案 1 :(得分:1)

如果您显示视图控制器,它将由导航控制器/呈现父视图/标签栏控制器保留。在这种情况下,您的ShareXML对象不会被任何内容保留。正如@Sam Ritchie指出的那样,如果你声明@property (nonatomic, retain) ShareXML *share;,那么在设置self.share时它会保留它。

确保在dealloc方法中释放它。我首选的方法是self.share = nil;,它会释放self.share当前保留的内容,并将其设置为nil。

答案 2 :(得分:0)

听起来像共享属性不是“保留”。因此在析构函数中,当共享成员被释放时,它将被第二次释放,因为已经释放了相同的对象shareXML。

答案 3 :(得分:0)

我找到了!我在ShareXML中发布了委托。感谢所有的评论,它让我检查了我的其余代码!