Objective-C: カテゴリ内のプロパティ/インスタンス変数 質問する

Objective-C: カテゴリ内のプロパティ/インスタンス変数 質問する

Objective-C のカテゴリに合成プロパティを作成できないため、次のコードを最適化する方法がわかりません。

@interface MyClass (Variant)
@property (nonatomic, strong) NSString *test;
@end

@implementation MyClass (Variant)

@dynamic test;

- (NSString *)test {
    NSString *res;
    //do a lot of stuff
    return res;
}

@end

試験方法実行時に複数回呼び出され、結果を計算するために多くの処理を行っています。通常、合成プロパティを使用して、メソッドが最初に呼び出されたときに IVar _test に値を保存し、次回はこの IVar を返します。上記のコードを最適化するにはどうすればよいでしょうか?

ベストアンサー1

.h ファイル

@interface NSObject (LaserUnicorn)

@property (nonatomic, strong) LaserUnicorn *laserUnicorn;

@end

.m ファイル

#import <objc/runtime.h>

static void * LaserUnicornPropertyKey = &LaserUnicornPropertyKey;

@implementation NSObject (LaserUnicorn)

- (LaserUnicorn *)laserUnicorn {
    return objc_getAssociatedObject(self, LaserUnicornPropertyKey);
}

- (void)setLaserUnicorn:(LaserUnicorn *)unicorn {
    objc_setAssociatedObject(self, LaserUnicornPropertyKey, unicorn, OBJC_ASSOCIATION_RETAIN_NONATOMIC); 
}

@end

通常のプロパティと同様に、ドット表記でアクセスできます

NSObject *myObject = [NSObject new];
myObject.laserUnicorn = [LaserUnicorn new];
NSLog(@"Laser unicorn: %@", myObject.laserUnicorn);

より簡単な構文

あるいは、@selector(nameOfGetter)次のように静的ポインター キーを作成する代わりに、次のように使用することもできます。

- (LaserUnicorn *)laserUnicorn {
    return objc_getAssociatedObject(self, @selector(laserUnicorn));
}

- (void)setLaserUnicorn:(LaserUnicorn *)unicorn {
    objc_setAssociatedObject(self, @selector(laserUnicorn), unicorn, OBJC_ASSOCIATION_RETAIN_NONATOMIC); 
}

詳細についてはhttps://stackoverflow.com/a/16020927/202451

おすすめ記事