2012-02-08 183 views
0

我正在开发一个启用了弧的iPad应用程序。 但我现在使用一个没有弧的小框架。我设置了标志-fno_objc_arc等。 但那里仍留有一个问题: 框架内的一个对象保存到当前的viewController的参考。 如果我离开当前的ViewController,框架释放控制器属性:ARC和非ARC框架 - iOS - 适当的释放不工作?

[viewController release]; 

的对象被释放,一切似乎要被罚款。但仔细一看,你会发现所有的实例变量仍然有效且存在。 假设我的viewController有两个实例变量实例变量 - 一个数组和subviewController。通常在弧中,如果主对象被释放,实例变量将被解除分配。但是,如果非弧框架发送释放消息,似乎该对象不会释放其实例变量,导致内存错误,因为它们在其他地方没有引用!

EDIT

下面是引用计数,该表是释放 的viewController的实例变量:

控制器之前:1
控制器实例表之前:1
现在[的viewController释放]被发送
控制器后:0
控制器实例表之后:1

对这个问题有什么建议?我将不胜感激任何帮助!使用ARC

回答

0

亲爱的朋友,并不意味着存在的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]); 
+0

是的,谢谢,这正是它应该如此: 理由:即使ARC自动销毁实例变量.....(ARC Doc) 但是如果[viewController release]被调用(在非弧框架中) ,释放控制器(由arc管理)的实例变量仍然存在,尽管retainCount为1 - 在发布发布之前和之后 – Alexander 2012-02-08 10:49:24

+0

是否检查过它,或者您只是假设了这一点? – 2012-02-08 10:54:53

+0

我应该如何设想?我没有调试检查它:po [viewController controllerTable] (gdb)print(int)[0x88be250 retainCount] $ 1 = 1 Now [viewController release]; (gdb)print(int)[0x88be250 retainCount] $ 2 = 1 – Alexander 2012-02-08 10:58:00