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);
}