做開發(fā)時我們常常會需要在已經實現(xiàn)了的類中增加一些方法虏等,這時候我們一般會用Category的方式來做只怎。但是這樣做我們也只能擴展一些方法,而有時候我們更多的是想給它增加一個屬性冲杀。由于類已經是編譯好的了效床,就不能靜態(tài)的增加成員了睹酌,這樣我們就需要自己來實現(xiàn)getter和setter方法了,在這些方法中動態(tài)的讀寫屬性變量來實現(xiàn)屬性扁凛。一種比較簡單的做法是使用Objective-C運行時的這兩個方法:
<pre>
void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy);
id objc_getAssociatedObject(id object, const void *key);
</pre>
這兩個方法可以讓一個對象和另一個對象關聯(lián)忍疾,就是說一個對象可以保持對另一個對象的引用,并獲取那個對象谨朝。有了這些卤妒,就能實現(xiàn)屬性功能了。 policy可以設置為以下這些值:
<pre>
enum {
OBJC_ASSOCIATION_ASSIGN = 0,
OBJC_ASSOCIATION_RETAIN_NONATOMIC = 1,
OBJC_ASSOCIATION_COPY_NONATOMIC = 3,
OBJC_ASSOCIATION_RETAIN = 01401,
OBJC_ASSOCIATION_COPY = 01403
};
</pre>
這些值跟屬性定義中的nonatomic字币,copy则披,retain等關鍵字的功能類似。
Example
下面是一個屬性自定義getter和setter的例子:
<pre><code>
NSString const * kExposeController = @"exposeController";
-(UIViewController *)exposeController {
return (UIViewController *)objc_getAssociatedObject(self, kExposeController);
}
-(void)setExposeController:(UIViewController *)exposeController {
objc_setAssociatedObject(self, kExposeController, exposeController, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
</code></pre>
可以看出使用objc_setAssociatedObject和objc_getAssociatedObject函數可以很方便的實現(xiàn)屬性的getter和setter洗出。
原文連接
OBJc在Category中實現(xiàn)屬性
拓展閱讀 http://stackoverflow.com/questions/5909412/what-is-objc-setassociatedobject-and-in-what-cases-should-it-be-used
Adding Properties to an Objective-C Category
Objective-C: Property / instance variable in category