2011-08-12 39 views

回答

33

比方說,你有以下幾種:

@class PotatoPeeler : NSObject 
- (instancetype)initWithWidget: (Widget *)w; 
@end 

然後添加一個工廠方法,你就改成這樣:

@class PotatoPeeler : NSObject 
+ (instancetype)potatoPeelerWithWidget: (Widget *)w; 
- (instancetype)initWithWidget: (Widget *)w; 
@end 

以及實現,簡直是:

+ (instancetype)potatoPeelerWithWidget: (Widget *)w { 
    return [[[self alloc] initWithWidget: w] autorelease]; 
} 

編輯:替換爲idinstancetype。它們在功能上是完全相同的,但後者爲編譯器提供了關於方法返回類型的更好的提示。

+12

+1注意使用'而不是self'硬編碼的類名來的alloc-初始化實例,以**手柄子類正確**('這裏self'指類對象本身)。還要注意返回類型'id':[「便利構造函數的返回類型是id,原因是它是初始化方法的id」](http://developer.apple.com/library/mac/documentation/Cocoa/概念/ ObjectiveC /章/ ocAllocInit.html#// apple_ref/doc/uid/TP30001163-CH22-SW12) – albertamg

+0

@albertamg:沒錯。 :) –

+1

希望谷歌索引它這次;) –

-4
-(MYClass*) myInit{ 
    self = [super init]; 

    /* Your code */ 

    return self; 
} 

假設你從NSObject派生你的類。

只要給它任何你想傳遞給構造函數的參數。

4

通常我的方法如下:首先我創建一個普通的初始化方法(實例方法),然後創建一個調用普通初始化方法的類方法。在我看來,Apple大部分時間都使用相同的方法。舉個例子:

@implementation SomeObject 

@synthesize string = _string; // assuming there's an 'string' property in the header 

- (id)initWithString:(NSString *)string 
{ 
    self = [super init]; 
    if (self) 
    { 
     self.string = string; 
    } 
    return self; 
} 

+ (SomeObject *)someObjectWithString:(NSString *)string 
{ 
    return [[[SomeObject alloc] initWithString:string] autorelease]; 
} 

- (void)dealloc 
{ 
    self.string = nil; 

    [super dealloc]; 
} 

@end 
相關問題