2

この単純なボイラープレートを繰り返すメソッドがたくさんあります。

- (id)myObject {
    if(!_myObject) {
        self.myObject = [_myObject.class new];
    }
    return _myObject;
}

したがって、これを単純なマクロに置き換えたいと思います。

#define default_init(instance) \
    if(!instance) instance = [instance.class new]; \
    return instance;

そのため、次のように呼び出すだけです。

- (id)myObject {
        default_init(_myObject);
}

上記のコードは現在コンパイルされていますが、問題は、マクロがインスタンス変数の値を直接設定することです。代わりに、self.instance = value; を呼び出したいと思います。

だから代わりに

if(!instance) instance = [instance.class new];

次のようなものが欲しいです。

if(!instance) self.instance = [instance.class new];

しかし、明らかに現在のコードではこれが許可されていません。どうすればこのようなことを達成できますか?

4

3 に答える 3

0

わかりました、これが私の見解です。

注: これは、実行できるかどうかを確認するためだけに行われました。これを配送コードで使用するのは良い考えではないと思います。

最初にlibextobjc#import "EXTRuntimeExtensions.h"からインポートします。それで:

#define underize(name) _##name

#define property_type(property) \
    property_attr(property)->objectClass

#define property_attr(propertyName) \
    ext_copyPropertyAttributes(class_getProperty(self.class, # propertyName))

#define default_init(propertyName) \
    - (id)propertyName { \
       if(!underize(propertyName)) self.propertyName = [property_type(propertyName) new]; \
       return underize(propertyName); \
} \

次に、プロパティがあるとします。

@property (nonatomic) NSArray *myArray;

できるよ:

default_init(myArray);

これにより、デフォルトのゲッターが作成されます。

于 2013-03-23T16:45:59.573 に答える
0

getter メソッドを作成するマクロの代わりに、通常は次のようにプロパティを宣言します。

インスタンス.h

@interface Instance : NSObject
@property NSMutableArray* myObject ;
@end

オーバーライド- initしてプロパティを初期化します。

インスタンス.m

- (id) init {
    self = [super init] ;
    if ( self ) {
        self.myObject = [NSMutableArray new] ;
    }
    return self ;
}
于 2013-03-23T16:36:17.373 に答える