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