標籤:associated category ios property
奇技淫巧 指過於奇巧而無益的技藝與製品.
轉載請註明出處 http://blog.csdn.net/uxyheaven/article/details/46789065
眾所周知,一般的情況下我們是沒辦法在category裡加屬性的.
如果想加,需要用到Associated.
@interface NSObject (XYFlyweightTransmit)@property (nonatomic, strong) id uxy_flyweightData;@end@implementation NSObject (UXYFlyweightTransmit)- (id)uxy_flyweightData{ return objc_getAssociatedObject(self, NSObject_key_flyweightData);}- (void)setUxy_flyweightData:(id)flyweightData{ objc_setAssociatedObject(self, NSObject_key_flyweightData, flyweightData, OBJC_ASSOCIATION_RETAIN_NONATOMIC);}@end;
如果每次需要寫這麼多代碼才可以實現, 確實很繁瑣.
一般我們會按照下面的代碼封裝一下
@interface NSObject (XY_associated)- (id)uxy_getAssociatedObjectForKey:(const char *)key;- (id)uxy_retainAssociatedObject:(id)obj forKey:(const char *)key;- @end@implementation NSObject (XY_associated)- (id)uxy_getAssociatedObjectForKey:(const char *)key{ const char * propName = key; id currValue = objc_getAssociatedObject( self, propName ); return currValue;}- (id)uxy_retainAssociatedObject:(id)obj forKey:(const char *)key;{ const char * propName = key; id oldValue = objc_getAssociatedObject( self, propName ); objc_setAssociatedObject( self, propName, obj, OBJC_ASSOCIATION_RETAIN_NONATOMIC ); return oldValue;}
這樣,我們只需要按照如下方式添加一個屬性
- (UIView *)overlay{ return [self uxy_getAssociatedObjectForKey:"xy.navigationBar.overlay"];}- (void)setOverlay:(UIView *)overlay{ [self uxy_retainAssociatedObject:overlay forKey:"xy.navigationBar.overlay"];}
上面的代碼看起來還是有不少重複的地方, 我們在用一個宏來封裝一下.
可是當我們真正寫宏的時候就發現get方法好寫, set方法無從下手, 因為後面是跟的一個大寫的字母.
一般用下面的不漂亮的方法解決:
* 約定屬性用大寫字母開頭
* 約定底線開頭
* 寫宏的時候吧setName名字傳進去
不過,本文的標題既然叫奇技淫巧,用的的當然不是上述的方法.
先來看下代碼錶現起來是怎樣的
@interface UINavigationBar (XY)uxy_property_as_associated_strong(id, test2);@end@implementation UINavigationBar (XY)uxy_property_def_associated_strong(id, test2)@end{ self.test2 = @"a"; id c = self.test2; NSLog(@"%@", c);}
實現思路:
在申明屬性的時候用setter來修改屬性的set方法,在前面加 __ 避開大小寫.
具體實現代碼如下:
#define uxy_property_as_associated_strong( __type, __name) \ @property (nonatomic, strong, setter=set__##__name:, getter=__##__name) __type __name;#define uxy_property_def_associated_strong( __type, __name) \ - (__type)__##__name \ { return [self uxy_getAssociatedObjectForKey:#__name]; } \ - (void)set__##__name:(id)__##__name \ { [self uxy_retainAssociatedObject:__##__name forKey:#__name]; }
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
Objective-C 奇技淫巧--用來在category裡加屬性的宏