2013-09-23 120 views
9

通過這個document on class clusters解析,NSNumber在大致有以下幾種方式實現initWithChar:集羣初始化與ARC

- (id)initWithChar:(char)c 
{ 
    [self release]; 
    return [[__NSCharNumber alloc] initWithChar:c]; 
} 

同樣,你可以使用此模式從筆尖初始化觀點:

- (id)initWithFrame:(CGRect)frame 
{ 
    id realSelf = [[self class] nib] instantiateWithOwner:nil options:nil][0]; 
    realSelf.frame = frame; 
    [self release]; 
    return realSelf; 
} 

我我想知道,在這些情況下,ARC是否會管理未歸還的self?它記錄在任何地方嗎?

+0

這是「類集羣」,而不是「集羣類」。 – jlehr

回答

6

找到詳細資料in the clang documentation

init隱式使用__attribute__((ns_consumes_self))屬性,這意味着,雖然self被定義爲__strong id self,初始分配不執行保留。這意味着只要self重新分配或功能終止,將使用標準強規則發佈self

要獲得+1輸出,有一個隱含的__attribute((ns_returns_retained)),它可以防止返回的對象在最後被釋放。

在高層次上,ARC計劃在函數結束時額外釋放一個初始值self,同時還保留返回值,保持+1輸出。

+0

謝謝Brian。你能不能展示一下代碼的樣子? – Slabko

+1

@Slabko除了在'initWith ...'中返回一個子類的新實例外,沒有什麼比這更好的了。我在這裏彙總了幾個類集羣的示例:https://github.com/bnickel/Cluster-Initializer-Examples –

3

它屬於標準ARC對象所有權規則,因此「未歸還self」最終沒有任何強引用,因此會在超出範圍時自動發佈。