@ synthesize'd Objective-C屬性非常好。有時候,需要定製getter或setter的行爲。我在尋找的默認實現一個列表中的所有12個(3 * 2 * 2)不同的方案:@property獲取器和設置器的默認實現列表
- 分配/保留/複製
- 非原子或不
- getter和setter
編輯我正在尋找標準的Objective-C實現,而不是合成屬性的低級別Clang實現。不幸的是,Apple's documentation只提到了上面的幾個情景,但不是更「異國情調」的原子。
@ synthesize'd Objective-C屬性非常好。有時候,需要定製getter或setter的行爲。我在尋找的默認實現一個列表中的所有12個(3 * 2 * 2)不同的方案:@property獲取器和設置器的默認實現列表
編輯我正在尋找標準的Objective-C實現,而不是合成屬性的低級別Clang實現。不幸的是,Apple's documentation只提到了上面的幾個情景,但不是更「異國情調」的原子。
它在Clang的源代碼中可用。參見this,特別是CodeGenFunction::GenerateObjCGetter
和CodeGenFunction::GenerateObjCSetter
。請注意,這不是Objective-C代碼首先生成並編譯的;它直接完成。大概的想法是,對於非原子分配模式,或僅GC模式,生成直接讀取/寫入代碼。其他一切都由祕密運行時功能objc_setProperty
和objc_getProperty
處理。
它們的定義反過來可以找到here。
無論如何,這不是你想先複製然後修改的東西。 Apple可能隨時更改實現的詳細形式,而不會破壞語義。
我建議你只寫一下我們在引入屬性之前寫的標準setter/getter。 請注意,您可以在.m
文件中擁有@synthesize foo
和您的自定義設置器setFoo:
。然後只產生吸氣劑。與其他情況類似。
或者,一種方法是合成一個名稱與您要定製的名稱略有不同的屬性。假設您有
@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;
}
我喜歡的方式稍有不同命名屬性的想法。然而,在大多數情況下,手動編寫代碼只是更簡單,更自我記錄。我實際上在尋找的是那些像**低級別的Clang實現一樣的**行爲的getter和setter的實現,但是它們是用標準的Objective-C編寫的。 – 2010-12-12 00:10:57
您是否閱讀過上面鏈接的obj_ {set,get} Property'的源代碼:http://www.opensource.apple.com/source/objc4/objc4-437.1/runtime/Accessors.subproj/objc-accessors .m?這是處理原子性的代碼等等。它的可讀性很好,並且在標準的Objective-C代碼中。那麼鎖使用'spin_lock_t',但你可以用任何其他的鎖代替它。 – Yuji 2010-12-12 02:40:20
瞭解他們的鎖定方法(+1)絕對是一個很好的閱讀。我希望,儘管有人已經完成了將代碼放在一起的工作,而Obj-C代碼可以用來構建自定義訪問器。 – 2010-12-13 16:35:17