2012-04-13 4 views
0

可能性の重複:
Class methods which create new instancesカスタムNSObjectクラス、[CustomObj customObjWithData:データ]のようにインスタンス化

私はNSStringの、NSArrayのなどなどのようなクラスのインスタンス化をエミュレートする方法を疑問に思ってこれは:[NSArray arrayWithObject:object] ... initsとallocを削除したいと考えています。

私はそれが実際に何をしているのかよくわからないかもしれません。ドキュメンテーションによると、[NSSArray array]は空の配列を作成して返します。それは実際に何を意味するのですか。

私は、カスタムNSObjectクラスを持つことができるようにしたいと実行します。[CustomObj customObjWithData:データ]

ありがとう!

あなたが好きな何かをする必要があります
+0

自動リリースされたオブジェクトを返します。 ARCを使用している場合は、alloc/init呼び出しの結果を返すだけで済みます。 –

答えて

5

まず対応するカスタムinit...メソッドを書きますallocとお客様のカスタムinit...メソッドを呼び出します。

+ (id)customObjWithFoo:(Foo *)aFoo 
{ 
    return [[[self alloc] initWithFoo:aFoo] autorelease]; 
} 

ARCでコンパイルする場合は、autorelease呼び出しを省略してください。

-1

...

+ (CustomObj *)customObjWithData:(NSData *)data { 
    return [[[CustomObj alloc] initWithData:data] autorelease]; 
} 

...とinitWithDataを実装:変数の初期化を処理します。

+3

常にイニシャライザから 'id'を返します。サブクラス化を適切にサポートするには、クラス名をハードコードするのではなく、 '[self alloc]'を使用してください。 –

0

これはクラスメソッドです。通常、インスタンスのinit *メソッドも持っています。そして、そのカスタムファクトリメソッドを追加し

- (id)initWithFoo:(Foo *)aFoo 
{ 
    // Do init stuff. 
} 

:たとえば...

- (id)initWithData:(NSData*)data 
{ 
    // Call appropriate super class initializer 
    if (self = [super init]) { 
    // Initialize instance with the data 
    } 
    return self; 
} 

+ (id)customObjWithData:(NSData*)data 
{ 
    return [[self alloc] initWithData:data]; 
} 

今、あなたはそれを呼び出すことができます...

CustomObj *obj = [CustomObj customObjWithData:data]; 
+0

ARCの下でなければ、コンストラクタは新しいオブジェクトを返す前に 'autorelease'を送るべきです。 –

+0

はい、個人的には、その問題に直接関係のない投稿のメモリ管理に関するすべてのコメントを見るのは嫌です。人々は、どのようなメモリ管理モデルをターゲットにしているかを知り、適切にコードを作成する必要があります。彼らがすでにメモリ管理について知っているなら、彼らはすでにこのコードがARCを前提としていることを知っています。そうでない場合、おそらくXcodeのARCリリースを使用している可能性があります。 –

-1

ここで多くの回答が正しいです。私は自分はいつもストーリーボード、インスタンス化を通じてインスタンス化エン簡単アロケーションのための方法を作成します。

//FooViewController.m

+ (id)create 
{ 
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Storyboard" bundle:nil]; 

    return [storyboard instantiateViewControllerWithIdentifier:@"FooViewController"]; 
} 

+ (UINavigationController *)createWithNavagionController 
{ 
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Storyboard" bundle:nil]; 

    FooViewController *fooViewController = [storyboard instantiateViewControllerWithIdentifier:@"fooViewController"]; 

    UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:fooViewController]; 

    return navigationController; 
} 

そして、あなたはパラメータが必要な場合は、のようなクラスメソッドを作成:createWithNameを:(NSStringの*)名前

関連する問題