2010-12-10 82 views
1

@ synthesize'd Objective-C屬性非常好。有時候,需要定製getter或setter的行爲。我在尋找的默認實現一個列表中的所有12個(3 * 2 * 2)不同的方案:@property獲取器和設置器的默認實現列表

  • 分配/保留/複製
  • 非原子或不
  • getter和setter

編輯我正在尋找標準的Objective-C實現,而不是合成屬性的低級別Clang實現。不幸的是,Apple's documentation只提到了上面的幾個情景,但不是更「異國情調」的原子。

回答

3

它在Clang的源代碼中可用。參見this,特別是CodeGenFunction::GenerateObjCGetterCodeGenFunction::GenerateObjCSetter。請注意,這不是Objective-C代碼首先生成並編譯的;它直接完成。大概的想法是,對於非原子分配模式,或僅GC模式,生成直接讀取/寫入代碼。其他一切都由祕密運行時功能objc_setPropertyobjc_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; 
} 
+0

我喜歡的方式稍有不同命名屬性的想法。然而,在大多數情況下,手動編寫代碼只是更簡單,更自我記錄。我實際上在尋找的是那些像**低級別的Clang實現一樣的**行爲的getter和setter的實現,但是它們是用標準的Objective-C編寫的。 – 2010-12-12 00:10:57

+2

您是否閱讀過上面鏈接的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

瞭解他們的鎖定方法(+1)絕對是一個很好的閱讀。我希望,儘管有人已經完成了將代碼放在一起的工作,而Obj-C代碼可以用來構建自定義訪問器。 – 2010-12-13 16:35:17