为什么我的属性getter会导致NSZombie错误?

时间:2011-10-13 14:22:03

标签: iphone objective-c ios retain dealloc

我有一个名为JSONNetworkUtility的服务对象,我将它作为ivar存储在我的模型中,以及具有相同名称,非原子和保留的合成属性:

myNetworkUtility = [[JSONNetworkUtility alloc] initNetworkConnectionWithURL:urlString withQueryString:nil delegate:self];

代表包含两个回调,一个是networkUtility:didFailWithError:,另一个是networkUtility:didFinishWithData:。奇怪的是,该属性导致了一些奇怪的错误:

- (void)networkUtility:(JSONNetworkUtility *)networkUtility didFinishWithData:(NSArray *)jsonArray
{
    NSLog(@"myNetworkUtility = %@", myNetworkUtility);
    // returns <JSONNetworkUtility: 0x3944450>

    NSLog(@"networkUtility = %@", networkUtility);
    // also returns <JSONNetworkUtility: 0x3944450>

    NSLog(@"self.myNetworkUtility = %@", self.myNetworkUtility);
    // fails and throws an NSZombie error!
}

我在该行上遇到的错误是:

  

*** - [MyModel myNetworkUtility]:发送到已解除分配的实例的消息0x148190

我完全难过!关于为什么它在吸气器上失败的任何线索?为什么它会返回一个完全不同的对象?

我使用getter的原因是因为我想使用self.myNetworkUtility = nil所以我可以用一个新对象在属性的顶部写字,但是我已经把它切回到这个跟踪而我我还有问题......

谢谢!

1 个答案:

答案 0 :(得分:6)

我认为问题在于MyModel已取消分配。当您访问ivar时,对象仍然存在于该内存地址中,内存尚未损坏。但是当发送消息到解除分配的'self'时,运行时会捕获到对象被释放的事实。