@ synthesize'd Objective-C属性很棒。但有时需要自定义getter或setter的行为。我正在搜索所有12(3 * 2 * 2)种不同场景的默认实现列表:
编辑我正在寻找标准的Objective-C实现,而不是合成属性的低级Clang实现。不幸的是,Apple's documentation只提到了上述几种情况,而不是更具“异国情调”的原子情景。
答案 0 :(得分:3)
它可以在Clang的源代码中找到。请参阅this,特别是CodeGenFunction::GenerateObjCGetter
和CodeGenFunction::GenerateObjCSetter
。请注意,不是首先生成Objective-C代码然后编译;它是直接完成的。粗略的想法是,对于非原子分配模式,或者在仅GC模式下,生成直接读/写代码。其他所有内容都由秘密运行时函数objc_setProperty
和objc_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;
}