【问题标题】:Why does my property getter cause an NSZombie error?为什么我的属性 getter 会导致 NSZombie 错误?
【发布时间】:2011-10-13 14:22:03
【问题描述】:

我有一个名为 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,所以我可以用一个新对象覆盖属性的顶部,但我已经把它剪回到这个跟踪,我还是有问题...

谢谢!

【问题讨论】:

  • 我没有(愚蠢地)提到我以相同的方法向上面的对象发布了一个委托调用,但我没有在上面发布那行。这是发送调用完成的消息,然后释放 MyModel...因此引用 getter 的跟踪失败。

标签: iphone objective-c ios retain dealloc


【解决方案1】:

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

【讨论】:

  • 这就解释了为什么错误指向不同的对象——它是 MyModel,而不是 myNetworkUtility!太棒了...谢谢! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多