2017-03-21 6 views
1

我々は、すべてのクラスのインスタンスをインスタンス化するため、次のパターンに精通している:のObjective-Cクラスのメソッドのローカル変数「自己」

+ (instancetype)createInstance { 
    return [[self alloc] init]; 
} 

この場合の「自己」を指し、これは動作しますクラスの青写真から構築されたオブジェクトではなく、クラスになります。

我々はまた、この宣言を知っているが、最も一般的なサイクルを維持回避に使用される:

typeof(self) someStrongSelf = self; 

これはあるがselfの型が動的にすることができますし、どんなにクラスを必要とどこそのコードをコピーし、貼り付けることができます。クラスメソッドからインスタンス化する際に上記の二つのパターンを組み合わせることで

私の質問のお得な情報:

+ (instancetype)createInstance:(MyObject*)dependency { 
    typeof(self) instance = [[self alloc] init]; 
    instance.dependency = dependency; 

    return instance; 
} 

selfはクラスであり、そしてtypeof(class)はちょうどClassですが、いくつかのがあるので、これは動作しません私はtypeof(インスタンス)と同じ柔軟性を持つことができるinstancetypeに相当するローカル変数のためのメカニズム?たとえば:

+ (instancetype)createInstance:(MyObject*)dependency { 
    instanceof(self) instance = [[self alloc] init]; //desired keyword 
    instance.dependency = dependency; 

    return instance; 
} 

私は本当にこれが正式に望んでいた場合、私はこれに代わるものは、上記のように基本的に同じことを行い、プロトコルを定義することになるが、知っているのObjective-Cは希望宣言を許可する場合、私は好奇心が強いですスタイリッシュなスタイル。

+0

私は@Robに同意します。なぜあなたはそれを一般的なものにしておきたいのか分かりません。 'TheClass *インスタンス= [[TheClass alloc] init]; instance.dependency = dependency; ' –

+0

私の質問には実用的な理由はあまりありません。私はちょうど '[[self alloc] init]の呼び出しを強くタイプしているので、キーワードを見落としてしまったのか不思議でした。しかし、私は前にObjective-Cに関連するどんなSOの質問にも出てきたと思います... – Chris

答えて

0

あなたが探しているものは理解していますが、instanceof(self)パターンはありません。確かtypeof(self)パターンの優雅さを持っていませんが、以下は、あなたが望むものを実現:

@interface Foo: NSObject 
@property (nonatomic, copy) NSString *string; 
@end 

@implementation Foo 
+ (instancetype)fooWithString:(NSString *)string { 
    Foo *foo = [[self alloc] init]; 
    foo.string = string; 
    return foo; 
} 
@end 

@interface Foobar: Foo 
// perhaps some more properties here 
@end 

@implementation Foobar 
// and perhaps some more methods here 
@end 

この実装では、便利な方法はまだサブクラス化を可能にすることを実証しています。つまり、あなたが行うことができます:

Foobar *foobar = [Foobar fooWithString:@"baz"]; 

し、その結果のオブジェクトは、Foobarインスタンスになります。

+0

それは典型的に私が従うパターンです。クラスの観点から「自己」に補完的なキーワードがないことに失望しますが、何ができますか? – Chris

関連する問題