0

重複の可能性:
新しいインスタンスを作成するクラスメソッド

NSString、NSArrayなどのクラスのインスタンス化をどのようにエミュレートするのか疑問に思っています:[NSArray arrayWithObject:object]...initとallocを削除することを期待しています。

私はそれが実際に何をするのかよく知らないかもしれません。ドキュメントによると、[NSSArray配列]は空の配列を作成して返します。それは本当にどういう意味ですか、割り当てはありますか?

カスタムNSObjectクラスを作成して、次のことを実行できるようにしたい:[CustomObj customObjWithData:data]

ありがとう!

4

4 に答える 4

5

まず、対応するカスタムinit...メソッドを記述します。

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

次に、呼び出すカスタムファクトリメソッドとカスタムメソッドを追加しallocますinit...

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

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

于 2012-04-13T19:08:22.913 に答える
0

それらはクラスメソッドです。通常、インスタンスのinit*メソッドもあります。例えば...

- (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];
于 2012-04-13T19:06:23.860 に答える
-1

あなたは次のようなことをする必要があるでしょう...

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

...そして、変数の初期化を処理するためにinitWithData:を実装します。

于 2012-04-13T19:04:59.620 に答える
-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 *)name

于 2012-04-13T20:15:39.910 に答える