2012-12-12 31 views
0

我們正在繼承UITabBarController以及UITabBarControllerDelegate以處理有關標籤開關的某些事件。ARC - 代表(分配)太早發佈

現在,在我們的自定義標籤欄控制器,我們有:

- (id)initCustomTabBarController { 
    self = [super init]; 
    if(self) { 
     [self setDelegate:[[CustomTabBarControllerDelegate alloc] init]]; 
     // ... 
    } 
    return self; 
} 

由於我們轉變的項目ARC,委託被釋放到早期引起碰上一個釋放的實例選項卡切換。

該屬性定義爲assignUITabBarController.h - 這顯然對我沒有影響。

我能做些什麼來使委託對象「活」比init方法更長?

+0

你什麼時候在ARC之前發佈它? – Thilo

+0

相關:http://stackoverflow.com/questions/12786748/transitioning-to-arc-causing-delegate-issues?rq=1 – Thilo

回答

2

你已經做到了這一點,預計代表不會比對象活得多,因爲它很弱。記住,你創建了這個對象,這取決於你自己。

但是 - 您使用的模式不正確。

委託的要點是它爲一個類提供方法實現,類不能爲自己添加方法,因爲它沒有足夠的信息。例如,一個表視圖委託。爲了通用,表視圖無法知道要顯示多少行或幾個部分,因此它會要求委託人提供此信息。

就你而言,你有一個對象正在創建它自己的委託。在這種情況下,爲什麼麻煩有一個代表呢?只需實現類中的方法。

+0

該方法是在不同的類,因爲我們有一個標籤欄控制器的子類爲每個iPhone和iPad兼容。 –

+0

我錯了,它實際上只在一個類中使用,我現在在同一個類中實現了委託方法 - 感謝您指出錯誤的體系結構! –

2

是的,在ARC下這將是正常的,因爲沒有提及它(也稱爲強大propENTS),它應該在循環結束時釋放。

只要在你分配CustomTabBarControllerDelegate的類中做一個屬性,使其變得強大。然後將此屬性分配給委託。

以非ARC的方式設置它可能會造成內存泄漏。