2010-08-20 89 views
0

這是一個例子直接從蘋果公司的文件 -什麼時候應該使用Class方法而不是init實例方法?

@implementation MyClass 

- (id)initWithString:(NSString *)aName 
{ 
    self = [super init]; 
    if (self) { 
     name = [aName copy]; 
    } 
    return self; 
} 

+ (MyClass *)createMyClassWithString: (NSString *)aName 
{ 
    return [[[self alloc] initWithString:aName] autorelease]; 
} 
@end 

正如我無論如何建立在每種情況下一個新的MyClass對象,我想知道爲什麼我會用類方法createMyClassWithString:aName代替的實例方法initWithString:aName

感謝

+0

爲了與命名約定保持一致,請從您的類方法名稱中刪除「create」前綴。在處理類似於[[NSObject alloc] init]的Core Foundation對象'CFClassCreate'時使用Create。創建的使用意味着你負責管理內存。 – falconcreek 2010-08-20 21:01:14

+0

感謝哥們,看起來很奇怪,蘋果選擇在他們的文檔中這樣命名。 – johnrees 2010-08-22 14:26:14

回答

0

我總是在可能的地方使用類方法,因爲它會減少冗長的代碼,並且如果您只是簡單地將對象返回給調用者,那麼無論如何您都必須自動釋放它,如果使用alloc獲取它。

在我看來,蘋果的建議措辭不佳。人們似乎認爲它是一個全面禁止autorelease的禁令。事實並非如此。你只需要注意autorelease帶有內存價格,但它不像你想象的那麼高。除了定時器事件外,每個runloop事件都有一個新的autorelease池,在返回到runloop時會被耗盡。所以如果你知道方法會很快就沒有問題了。另外,如果一個對象要超過當前事件,則不存在問題,因爲autorelease池中的對象的開銷很小,並且排空該池無論如何都不會釋放該對象。

唯一需要注意將對象不加區分地放置在自動釋放池中的情況是您需要進行大量處理以創建大量臨時自動釋放對象的情況。您可以通過創建自動釋放池並隨時消除這些方法來緩解這些方法的壓力。例如

while(someCondition) 
{ 
    NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init]; 

    // intensive processing 

    [pool drain]; 
} 
0

的唯一原因是可讀的,漂亮的代碼...

另外,在你的榜樣類方法返回一個自動釋放的情況下...

+0

好的,所以如果這是唯一的好處,並且因爲Apple推薦使用iPhone編程,你應該儘量避免autorelease在可能的情況下... 我認爲我應該放棄代碼美,並堅持使用實例方法編寫iOS代碼時?乾杯 – johnrees 2010-08-20 10:41:32

0

簡短的,無益的答案是:其中是有道理。兩者都不是更正確的;沒有錯。

一個例子可能會更多使用。

- (MyClass*) doStuff { 
    MyClass* retv = [MyClass createMyClassWithString:@"Simon says"]; 
    [retv someOtherMethod]; 
    return retv; 
} 

按照慣例返回自動釋放的對象,所以使用略少打字類方法的結果:如果我是從方法返回的值,我會用類方法。

相關問題