@property getters和setter的默认实现列表

时间:2010-12-10 11:28:55

标签: iphone objective-c properties

@ synthesize'd Objective-C属性很棒。但有时需要自定义getter或setter的行为。我正在搜索所有12(3 * 2 * 2)种不同场景的默认实现列表:

  • 分配/保留/复制
  • 非原子或不
  • getter and setter

编辑我正在寻找标准的Objective-C实现,而不是合成属性的低级Clang实现。不幸的是,Apple's documentation只提到了上述几种情况,而不是更具“异国情调”的原子情景。

1 个答案:

答案 0 :(得分:3)

它可以在Clang的源代码中找到。请参阅this,特别是CodeGenFunction::GenerateObjCGetterCodeGenFunction::GenerateObjCSetter。请注意,不是首先生成Objective-C代码然后编译;它是直接完成的。粗略的想法是,对于非原子分配模式,或者在仅GC模式下,生成直接读/写代码。其他所有内容都由秘密运行时函数objc_setPropertyobjc_getProperty处理。

反过来,他们的定义可以找到here

在任何情况下,它都不是您想先复制然后修改的东西。 Apple可能会随时更改实现的详细形式,而不会破坏语义。

我建议你在引入属性之前编写我们用来编写的标准setter / getter。 请注意,您可以在@synthesize foo文件中添加setFoo:和自定义设置器.m。然后只生成吸气剂。与其他情况类似。

或者,一种方法是合成一个名称与您要自定义的属性略有不同的属性。假设你有

@property (nonatomic,retain) NSString*foo;

.h文件中。我会放入.m文件

@interface Foo (private)
     @property (nonatomic,retain) NSString*_foo;
@end

@implementation Foo
@synthesize _foo; 

并将自定义设置为foo:setFoo:

-(NSString*)foo{
      ... do something ...
      return self._foo;
}