Objective-C:类别中的属性/实例变量

dhrm

由于无法在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。如何优化上面的代码?

戴夫·德隆

@lorean的方法将起作用(注意:答案现在已删除),但是您只有一个存储插槽。因此,如果您想在多个实例上使用它,并让每个实例计算一个不同的值,则它将无法正常工作。

幸运的是,Objective-C运行时具有称为关联对象的东西,它可以完全满足您的需求:

#import <objc/runtime.h>

static void *MyClassResultKey;
@implementation MyClass

- (NSString *)test {
  NSString *result = objc_getAssociatedObject(self, &MyClassResultKey);
  if (result == nil) {
    // do a lot of stuff
    result = ...;
    objc_setAssociatedObject(self, &MyClassResultKey, result, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
  }
  return result;
}

@end

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章