/ / initインスタンスメソッドの代わりにクラスメソッドを使用する必要があるのはいつですか? --iphone、objective-c、cocoa-touch、xcode

initインスタンスメソッドの代わりにクラスメソッドを使用するのはいつですか? - iPhone、Objective-C、Cocoa-Touch、Xcode

これはAppleのドキュメントから直接の例です-

@implementation MyClass

- (id)initWithString:(NSString *)aName
{
self = [super init];
if (self) {
name = [aName copy];
}
return self;
}

+ (MyClass *)createMyClassWithString: (NSString *)aName
{
return [[[self alloc] initWithString:aName] autorelease];
}
@end

私が新しいものを作成するので MyClass とにかくそれぞれの場合のオブジェクト、私はなぜ私が使用するかもしれないのか知りたいです クラスメソッド createMyClassWithString:aName その代わりに インスタンスメソッド initWithString:aName

ありがとう

回答:

回答№1は0

私は可能な限り常にクラスメソッドを使用しますコードの冗長性が低くなり、オブジェクトを呼び出し元に返すだけの場合は、allocを使用して取得した場合は、とにかく自動リリースする必要があるためです。

私の場合、Appleからのアドバイスはあまり言葉にされていません意見。人々はそれを自動リリースの全面禁止と見なしているようです。それは単にそうではありません。自動解放にはメモリ価格が伴うことに注意する必要がありますが、思ったほど高くはありません。タイマーイベントを除く各runloopイベントには、戻り時に排出される新しい自動解放プールが付属しています。したがって、メソッドが高速になることがわかっている場合は、問題はありません。また、オブジェクトが現在のイベントよりも長生きする場合、自動解放プール内のオブジェクトのオーバーヘッドは非常に小さく、プールを空にすることはとにかくオブジェクトの割り当てを解除しないため、問題はありません。

注意が必要な唯一のケースオブジェクトを無差別に自動解放プールに配置することは、大量の一時的な自動解放オブジェクトを作成する集中的な処理を行う場所です。自動解放プールを作成し、進行中にそれらを排出することで、これらのメソッドのプレッシャーを軽減できます。例えば

while(someCondition)
{
NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];

// intensive processing

[pool drain];
}

回答№2の場合は0

唯一の理由は、読みやすく美しいコードです...

さらに、あなたの例では、クラスメソッドは自動解放されたインスタンスを返します...


回答№3の場合は0

短くて役に立たない答えは次のようになります。どこが理にかなっているのか。どちらもより正確ではありません。どちらも間違っていません。

例はもっと使用するかもしれません。メソッドから値を返す場合は、クラスメソッドを使用します。

- (MyClass*) doStuff {
MyClass* retv = [MyClass createMyClassWithString:@"Simon says"];
[retv someOtherMethod];
return retv;
}

慣例により、自動解放されたオブジェクトを返すため、classメソッドを使用すると、入力がわずかに少なくなります。