2009-04-22 64 views
1

我有一個NSFoo類,有一個酒吧屬性。我想要一個類方法來獲取帶有bar屬性集的NSFoo實例。這將與NSString stringWithFormat類方法類似。所以它的簽名是:如何在Objective-C中創建分配器類方法?

+ (NSFoo *) fooWithBar:(NSString *)theBar; 

所以,我只能說這是這樣的:

NSFoo *foo = [NSFoo fooWithBar: @"bar"]; 

我想這可能是正確的:

+ (NSFoo *) fooWithBar:(NSString *)theBar { 
    NSFoo *foo = [[NSFoo alloc] init]; 
    foo.bar = theBar; 
    [foo autorelease]; 
    return foo; 
} 

是否正確?

+0

您可以通過在最後兩行合併成回報簡化它一點點[foo autorelease]; – 2009-04-22 15:44:27

+2

作爲一個方面說明,NS前綴是爲可可類保留的(最初是NextStep類庫)。如果需要防止名稱衝突,則應該爲自己的類使用自己的前綴。 – 2009-04-22 20:02:56

回答

2

是的,你的實現看起來是正確的。因爲-[NSObject autorelease]返回self,所以可以將return語句寫爲return [foo autorelease]。如果你打算使用自動釋放(而不是釋放),一些人建議在分配時自動釋放一個對象,因爲它使意圖清晰,並將所有內存管理代碼保存在一個地方。然後,您的方法可以寫成:

+ (NSFoo *) fooWithBar:(NSString *)theBar { 
    NSFoo *foo = [[[NSFoo alloc] init] autorelease]; 
    foo.bar = theBar; 

    return foo; 
} 

當然,如果-[NSFoo initWithBar:]存在,你可能會寫這個方法

+ (NSFoo *) fooWithBar:(NSString *)theBar { 
    NSFoo *foo = [[[NSFoo alloc] initWithBar:theBar] autorelease]; 

    return foo; 
} 
2

是的。它看起來不錯。你的實現看起來是一種常見的做法。