目的C-カスタム@synthesize?
-
27-10-2019 - |
質問
カスタムゲッター、セッターを生成してカスタム@synthesizeを作成することは可能ですか?
例えば:
@interface
@property (nonatomic, retain) MyObject *object;
@end
@implementation
@lazyInitialize object;
@end
そして、どういうわけか@lazyInitializeを定義して、怠zyな初期イザーメソッドを生成します
//@lazyInitialize
- (id)"property name"
{
if (!"property name")
{
"property name" = [[["property name" class] alloc] init];
}
return "property name";
}
解決
ただし、何か違うことを試すことができます。私は数日前にこれについて考えていなかったでしょうが、私はたまたま読んでいました 愛のあるココア. 。リンクされている投稿で、彼は彼がどのようにして作ったかを議論しました #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
他のヒント
@synthesize
Objective-Cでは、C#の自動プロパティ構文と同様に機能します。そのため、プロパティゲッター/セッターを作成するために必要な最小限の構文を生成することです。両方の言語で、カスタム機能が必要な場合は、手動で実装する必要があります。
私は本当に好きです ライアン・ワーサルの答え の使用の #define
独自のマクロを転がします。あなたはまだ自分で方法を書く必要がありますが、あなたは一度だけそれをします。