3

カスタムの @synthesize を作成して、カスタムのゲッター、セッターを生成することは可能ですか??

例えば:

@interface
@property (nonatomic, retain) MyObject *object;
@end

@implementation
@lazyInitialize object;
@end

そして、どういうわけか @lazyInitialize を定義して、遅延初期化メソッドを生成します

//@lazyInitialize

- (id)"property name"
{
   if (!"property name")
   {
      "property name" = [[["property name" class] alloc] init];
   }
   return "property name";
}
4

2 に答える 2

5

ただし、別のことを試すこともできます。数日前までは考えもしなかったことですが、たまたまCocoa With Loveを読んでいました。#defineリンクされた投稿で、彼は、マクロを呼び出した場所にシングルトンのクラス全体を「生成」するマクロをどのように作成したかについて説明しました。このための彼のコードをダウンロードできます(独自の実装に関するアイデアが得られるかもしれません)。

おそらく次のようなものです(警告:未テストのコード先):

#define SYNTHESIZE_LAZY_INITIALIZER_FOR_OBJECT(objectName, objectType) \
\
- (objectType *)objectName \
{ \
    if(!objectName) \
    { \
          objectName = [[objectType alloc] init]; \
    } \
    return objectName; \
} \
\
- (void)set##objectName:(objectType *)value \
{ \
    [value retain]; \
    [objectName release]; \
    objectName = value; \
}

動作しますか?適切にテストする時間がないことをお詫びします。そのため、これは簡単なコピー/貼り付けソリューションではないことを公正な警告として受け止めてください. 申し訳ありません。うまくいけば、それはまだ役に立ちます!;)


使用例

これも機能するはずです警告:未テストのコードが先

ヘッダ

// ....
@interface SomeClass : NSObject {
    NSObject *someObj;
}
@end

実装

@implementation SomeClass
// ....
SYNTHESIZE_LAZY_INITIALIZER_FOR_OBJECT(someObj, NSObject);
// ....
@end
于 2011-05-01T17:44:50.587 に答える
2

@synthesizeObjective-C の は、プロパティのゲッター/セッターを作成するために必要な最小限の構文を生成するという点で、C# の自動プロパティ構文と同様に機能します。どちらの言語でも、カスタム機能が必要な場合は、手動で実装する必要があります。

a を使用して独自のマクロをロールするというRyan Wersal の回答が本当に気に入っています。#defineメソッドを自分で作成する必要がありますが、それを行うのは 1 回だけです。

于 2011-05-01T16:44:49.703 に答える