1

抽象クラスでは、カスタム init メソッドは次のようになります。

- (id)init
{
    self = [super init];

    if (self)
    {
        //do some initialisations
    }

    return self;
}

抽象クラスを扱う場合、これはまったく問題なく機能します。まったく問題ありません。ただし、オブジェクトを作成するときはClass *object = [Class new];Class *object = [[Class alloc]init];. 私の抽象クラスのこのようなメソッドの問題は、これが機能しないことです:

+ (id)new
{
    id object = [super new];

    if (object)
    {
        //do some initialisations
    }

    return object;
}

オブジェクトのプロパティにアクセスしようとすると、「__strong id」タイプのオブジェクトに対応するプロパティが見つからないことを示すエラーが Xcode によって表示されます。これは、オブジェクトが作成されたばかりであるため、コンパイラがオブジェクトのプロパティを認識していないためだと思います。

この制限を回避する方法はありますか? そうでない場合は、問題なく動作する init メソッドを使用しますが、これについては興味がありました。

4

3 に答える 3

3

オーバーライドする必要はありませんnew。ドキュメントによると、new...

受信クラスの新しいインスタンスを割り当て、init メッセージを送信し、初期化されたオブジェクトを返します。

したがって、オーバーライドinitして初期化を実行するだけです。その後、好みに応じてalloc/initまたはを介し​​て自由にインスタンスを作成できます。new

于 2012-09-13T17:52:04.700 に答える
2
+ (id)new
{
    return [[self alloc] init;
}

これはクラスメソッドであるため、+代わりに注意してください。-

new は NSObject に既に実装されているため、それを記述する必要はありません。

于 2012-09-13T17:54:33.143 に答える
0

使用しているパターンはお勧めしません。カスタム ファクトリ メソッドの初期化メソッドを作成する方がはるかにセマンティックです。

- (id) init
{
   // init code
}

- (id) initWithName:(NSString *)name
{
   // init code
}

+ (id) personWithName:(NSString *)name
{
    // add autorelease on non-ARC
    return [[super alloc] initWithName:name];
}

Person *person = [Person personWithName:@"Steve Jobs"];

クラスメソッドであることに注意してください。

于 2012-09-13T18:01:46.883 に答える