2011-08-12 6 views
19

私はカスタムオブジェクトに便利なコンストラクタを追加しようとしています。 [NSArray arrayWithArray:]に似ていますObjective-Cの便利なコンストラクタを書く方法

私には、自動リリースされたオブジェクトを返すクラスメソッドが含まれています。私は周りにグーグルしているが、私が見つけることができるように見えるのは、便利なコンストラクタの定義ですが、それを書く方法ではありません。

答えて

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ノートのalloc-のinitインスタンスに使用 'self'の代わりに、ハードコーディングされたクラス名の順で**ハンドルサブクラスは適切**('ここself'は、クラスを参照しますオブジェクト自体)。また、戻り値の型 'id'に注目してください:["利便性の高いコンストラクタの戻り値の型は、イニシャライザメソッドのidと同じ理由からidです] "(http://developer.apple.com/library/mac/documentation/Cocoa/概念/目的C /章/ ocAllocInit.html#// apple_ref/doc/uid/TP30001163-CH22-SW12) – albertamg

+0

@albertamg:まさに正しい。 :) –

+1

うまくいけば、今度はGoogleでインデックスを作成します;) –

-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 
関連する問題