1

Objective C の init メソッドで異なるクラスのインスタンスを返すことは可能ですか? MyCustomClass というクラスがあります。他に と という 2 つの異なるクラスがClass 1ありClass2ます。私が実装しようとしているのは[[MyCustomClass alloc] initWithSomeParameters、インスタンスを作成するために呼び出すとき、Class1またはClass2いくつかの条件に応じて呼び出すときです。

MyCustomClass.m:

#import "MyCustomClass.h"
#import "Class1.h"
#import "Class2.h"

-(id) initWithSomeParameters: (id) params{
  id myClass;
  if (someCondition){
    myClass = [[Class1 alloc] initWithSomeParameters:(id) params];
    [myClass setSomething:something];
  }else{
    myClass = [[Class2 alloc] initWithSomeParameters:(id) params];
    [myClass setSomething:something];
  }
  return myClass;
}

...そして後で電話します

id myCustomClass = [[MyCustomClass alloc] initWithSomeParameters:(id) params];

これは間違ったアプローチですか?もしそうなら、どれが正しいでしょうか?

4

4 に答える 4

3

他の何人かがこれについて言及していますが、呼び出しの結果は[[MyClass alloc] init]常にnilまたは一種の MyClass でなければなりません。MyClass特に;のインスタンスである必要はありません。NSArrayまたはのように、その子孫の 1 つが可能NSStringです。コードでは、この要件は次のようになります。

MyClass *a = [[MyClass alloc] init];
NSAssert((a==nil) || [a isKindOfClass:[MyClass class]], @"This must always hold true.");

これを実装しようとしたことはありませんが、おそらく次のようにする必要があります。

- (id)initAsSubclass:(NSString *)sublcassName
{
    Class c = NSClassFromString(subclassName);
    self = [[c alloc] init];
    if (self) {
        // Do Custom Init Here
    }
    return self;
}

キーは次のとおりです。

  • 実行しない[super init]でください。
  • でまったく新しいオブジェクトを作成します+alloc
  • 新しく作成したオブジェクトを に割り当てますself
  • ARC を使用していない場合は[self autorelease]、値を置き換える前に を実行します。(現在コードを実行しているオブジェクトの割り当てが解除されると、問題が発生する可能性があります。-autoreleaseこのセクションが完了するまで延期します。)
于 2013-11-01T14:41:24.197 に答える
1

それは良いアプローチではありません。ヘルパークラスまたはファクトリパターンを使用して、メソッドにパラメーターを提供することをお勧めします。次に、パラメータに応じて、クラスのオブジェクトを作成して返します。

異なるクラスのinitメソッドで異なるクラスのオブジェクトを作成するのは良い方法ではありません。

編集: iOS のバージョンに応じて UIView または UIAlertView を表示する場合は、次のようにします。

@interface AlertHelper : NSObject
+ (id)getAlert;
@end

///
@implementation AlertHelper
+(id)getAlert{
NSString *version = [[UIDevice currentDevice] systemVersion];
int ver = [version intValue];
if (ver < 7){
//For iOS 6
return something;
}
else{
//for ios 7
return something
}
}
@end
于 2013-11-01T13:51:12.793 に答える
1

正しいクラスを初期化するある種のコントローラーを作成する必要があります。クラスメソッドを使用して同じことを達成することもできます。

Aそして、ジャンルでは、この特定の実装は悪いです。メモリを一度割り当て[MyCustomClass alloc]てから、-(id)initWithSomeParameters:(id)paramsメモリを再度割り当てているからです。したがって、異なるアドレスでも返されます。これは Apple のガイドラインに反するものではありません。一部の Apple クラスにもそのような動作がありますが、最適化のためにそうしています。しかし、ここは間違っています。

于 2013-11-01T14:02:48.637 に答える