我有一个名为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
所以我可以用一个新对象在属性的顶部写字,但是我已经把它切回到这个跟踪而我我还有问题......
谢谢!
答案 0 :(得分:6)
我认为问题在于MyModel已取消分配。当您访问ivar时,对象仍然存在于该内存地址中,内存尚未损坏。但是当发送消息到解除分配的'self'时,运行时会捕获到对象被释放的事实。