我正在开发一个启用了弧形的iPad应用程序。 但我现在使用一个没有弧度的小框架。我设置了标志-fno_objc_arc,依此类推。 但仍有一个问题: 框架中的一个对象包含对当前viewController的引用。 如果我离开当前的ViewController,框架将释放控制器属性:
[viewController release];
对象被取消分配,一切似乎都没问题。但仔细观察,您会发现,所有实例变量仍然有效且存在。 让我们假设我的viewController有两个实例变量实例变量 - 一个数组和一个subviewController。通常在arc中,如果主对象被释放,则实例变量将被释放。但是如果非弧框架发送了释放消息,那么对象似乎不会释放它的实例变量,从而导致内存错误,因为它们在其他任何地方都没有被引用!
修改:
这是引用计数,表是释放的实例变量 的viewController:
控制器之前:1
控制器实例表之前:1
现在[viewController release]被发送了
控制器后:0
控制器实例表:1
对此问题的任何建议?我将不胜感激任何帮助!
答案 0 :(得分:0)
亲爱的朋友使用ARC并不意味着dealloc中没有发布代码。编译器在适当的位置插入发布代码,因此它还将释放代码插入到实例变量中,这些变量是不可见的,因为编译器在编译时插入它,因此当非弧框架发送释放消息时,如果您的对象被解除分配,我认为它的保留计数为1然后调用dealloc,并且在dealloc中也有实例变量的释放代码也会被释放(如果实例也有1个保留计数)
~~~~~~~~~~~~~~~~~~~~编辑~~~~~~~~~~~~~~~~~~~~~
使用此代码
NSLog(@"before release : viewController:%d controllerTable:%d",[viewController retainCount],[controllerTable retainCount]);
[viewController release];
// here just give os to deallocate its memory so I'm just inserting some code which is unnessary but it may give os to reclaim the memory
for (int i=0; i<10; i++) {
NSLog(@"Just do nothgin here and m also sleeping it to make sure that system get enoght time to reclaim the gabaged memory");
[NSThread sleepForTimeInterval:0.1];
}
//as it is crashed so commented
//NSLog(@"after release : viewController:%d",[viewController retainCount]);
//it should also crash now
NSLog(@"after release : controllerTable:%d",[controllerTable retainCount]);