0

私は財産を持っています

@property (strong, nonatomic, readonly) NSMutableArray*     myArray;

ゲッターで配列を怠惰に作成したい

- (NSMutableArray*)myArray
{
    if(_myArray == nil)
    {
        _myArray = [NSMutableArray arrayWithCapacity:4];
    }
    return _myArray;
}

ただし、これによりiVar( `_myArray)の自動合成が機能しなくなり、自動合成の利点の一部が無効になります。つまり、古い方法で処理を行う必要があります。

これは非常に一般的なパターンであり、レイジー作成バージョンのゲッターを自動合成すると便利です。これには、Objective-C言語とコンパイラの拡張が必要だと思います。たとえば、次のような追加のプロパティ属性を使用します。

@property (strong, nonatomic, readonly, lazycreate) NSMutableArray*     myArray;

プロパティ属性をサポートし、自動合成などの事前定義されたクラスメソッド(ここで説明するオブジェクトの添え字と同様の方法)を実装するクラスは、次のように私の例でゲッターを合成できます。+ (ClassType*)defaultConstructorlazycreate

- (NSMutableArray*)myArray
{
    if(_myArray == nil)
    {
        _myArray = [NSMutableArray defaultConstructor];
    }
    return _myArray;
}

これには言語拡張が必要になるのは正しいですか、それとも今それを達成するための賢い方法はありますか?

このアイデアに問題や落とし穴はありますか?それらは何ですか?

このアイデアをObjective-C言語に提案するにはどうすればよいですか?

4

2 に答える 2

1

のような新しいプロパティ属性を追加するlazycreateには、コンパイラを変更する必要があります。http://bugreport.apple.comで新しい問題を開くことにより、Appleに追加を依頼できます。製品は「開発ツール」であり、分類は「機能(新規)」です。

次のようなマクロを定義できます。

#define synthesizeLazy(Type, Property) \
    synthesize Property = _##Property; \
    - (Type *)property { \
        if (_##Property == nil) { _##Property = [[Type alloc] init]; } \
        return _##Property; \
    }

次に、それを使用して、次のような怠惰なプロパティを合成します。

@synthesizeLazy(NSMutableArray, myArray);

完全に自動合成でそれを偽造する良い方法はありません。

于 2012-08-21T03:08:23.343 に答える
0

NSObjectで利用可能なメタプログラミングメソッド(など)を確認する必要があります-implementationForMethod。これにより、実行時に欠落しているメソッドの実装を提供できます。

これを使用して、宣言されたプロパティに動的にゲッター/セッターを提供できます。

次に、デフォルト値の辞書から読み取ることができます。

オーバーライドしてみることもできます-valueForUndefinedKey:

これは役立つかもしれません:https ://gist.github.com/2370784

于 2012-08-21T03:15:08.280 に答える