Objective-C 奇技淫巧--用來在category裡加屬性的宏

來源:互聯網
上載者:User

標籤: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裡加屬性的宏

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.