日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ios 中的关联对象

發布時間:2025/3/18 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ios 中的关联对象 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

2019獨角獸企業重金招聘Python工程師標準>>>

?? 關聯對象的簡單使用:

#import "wangmumu.h" @interface wangmumu () { } @end static char staticString; @implementation SHVCarsViewController - ( void )viewDidLoad { ???? [ super viewDidLoad]; ???? // Do any additional setup after loading the view. ????? ???? self .edgesForExtendedLayout= UIRectEdgeNone ; ???? self .tableView.hidden = YES ; ???? UIButton *btn = [[ UIButton alloc]initWithFrame:CGRectMake(100, 100, 100, 100)]; ???? btn.backgroundColor = [ UIColor grayColor]; ???? [btn addTarget: self action: @selector (btnn:) forControlEvents: UIControlEventTouchUpInside ]; ???? objc_setAssociatedObject(btn, &staticString, @ "aaaa" , OBJC_ASSOCIATION_RETAIN_NONATOMIC); ???? [ self .view addSubview:btn]; ????? ????? } - ( void )btnn:( UIButton *)btn{ ???? NSString *str = objc_getAssociatedObject(btn, &staticString); ???? NSLog (@ "%@" ,str); } /* objc_setAssociatedObject(btn, &staticString, @"aaaa", OBJC_ASSOCIATION_RETAIN_NONATOMIC); 有四個參數 1.被關聯的對象 2.要關聯的對象的鍵值,一般設置成靜態的,用于獲取關聯對象的值 3.要傳得值 一般是靜態變量 4.關聯時采用的協議,有assign,retain,copy等協議 點擊進去選取枚舉 */ ? ? ? ? ? ?

關聯對象(Associated Object)

關聯對象是Runtime中一個非常實用的特性,不過可能很容易被忽視。

關聯對象類似于成員變量,不過是在運行時添加的。我們通常會把成員變量(Ivar)放在類聲明的頭文件中,或者放在類實現的@implementation后面。但這有一個缺點,我們不能在分類中添加成員變量。如果我們嘗試在分類中添加新的成員變量,編譯器會報錯。

我們可能希望通過使用(甚至是濫用)全局變量來解決這個問題。但這些都不是Ivar,因為他們不會連接到一個單獨的實例。因此,這種方法很少使用。

Objective-C針對這一問題,提供了一個解決方案:即關聯對象(Associated Object)。

我們可以把關聯對象想象成一個Objective-C對象(如字典),這個對象通過給定的key連接到類的一個實例上。不過由于使用的是C接口,所以key是一個void指針(const void *)。我們還需要指定一個內存管理策略,以告訴Runtime如何管理這個對象的內存。這個內存管理的策略可以由以下值指定:

1 2 3 4 5 OBJC_ASSOCIATION_ASSIGN OBJC_ASSOCIATION_RETAIN_NONATOMIC OBJC_ASSOCIATION_COPY_NONATOMIC OBJC_ASSOCIATION_RETAIN OBJC_ASSOCIATION_COPY

當宿主對象被釋放時,會根據指定的內存管理策略來處理關聯對象。如果指定的策略是assign,則宿主釋放時,關聯對象不會被釋放;而如果指定的是retain或者是copy,則宿主釋放時,關聯對象會被釋放。我們甚至可以選擇是否是自動retain/copy。當我們需要在多個線程中處理訪問關聯對象的多線程代碼時,這就非常有用了。

我們將一個對象連接到其它對象所需要做的就是下面兩行代碼:

1 2 3 static char myKey; ? objc_setAssociatedObject(self, &myKey, anObject, OBJC_ASSOCIATION_RETAIN);

在這種情況下,self對象將獲取一個新的關聯的對象anObject,且內存管理策略是自動retain關聯對象,當self對象釋放時,會自動release關聯對象。另外,如果我們使用同一個key來關聯另外一個對象時,也會自動釋放之前關聯的對象,這種情況下,先前的關聯對象會被妥善地處理掉,并且新的對象會使用它的內存。

1 id anObject = objc_getAssociatedObject(self, &myKey);

我們可以使用objc_removeAssociatedObjects函數來移除一個關聯對象,或者使用objc_setAssociatedObject函數將key指定的關聯對象設置為nil。

我們下面來用實例演示一下關聯對象的使用方法。

假定我們想要動態地將一個Tap手勢操作連接到任何UIView中,并且根據需要指定點擊后的實際操作。這時候我們就可以將一個手勢對象及操作的block對象關聯到我們的UIView對象中。這項任務分兩部分。首先,如果需要,我們要創建一個手勢識別對象并將它及block做為關聯對象。如下代碼所示:

1 2 3 4 5 6 7 8 9 10 11 12 13 - (void)setTapActionWithBlock:(void (^)(void))block { ???? UITapGestureRecognizer *gesture = objc_getAssociatedObject(self, &kDTActionHandlerTapGestureKey); ? ???? if (!gesture) ???? { ???????? gesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(__handleActionForTapGesture:)]; ???????? [self addGestureRecognizer:gesture]; ???????? objc_setAssociatedObject(self, &kDTActionHandlerTapGestureKey, gesture, OBJC_ASSOCIATION_RETAIN); ???? } ? ???? objc_setAssociatedObject(self, &kDTActionHandlerTapBlockKey, block, OBJC_ASSOCIATION_COPY); }

這段代碼檢測了手勢識別的關聯對象。如果沒有,則創建并建立關聯關系。同時,將傳入的塊對象連接到指定的key上。注意block對象的關聯內存管理策略。

手勢識別對象需要一個target和action,所以接下來我們定義處理方法:

1 2 3 4 5 6 7 8 9 10 11 12 - ( void )__handleActionForTapGesture:(UITapGestureRecognizer *)gesture { ???? if (gesture.state == UIGestureRecognizerStateRecognized) ???? { ???????? void (^action)( void ) = objc_getAssociatedObject(self, &kDTActionHandlerTapBlockKey); ? ???????? if (action) ???????? { ???????????? action(); ???????? } ???? } }

我們需要檢測手勢識別對象的狀態,因為我們只需要在點擊手勢被識別出來時才執行操作。

從上面的例子我們可以看到,關聯對象使用起來并不復雜。它讓我們可以動態地增強類現有的功能。我們可以在實際編碼中靈活地運用這一特性。

轉載于:https://my.oschina.net/u/2329800/blog/652049

總結

以上是生活随笔為你收集整理的ios 中的关联对象的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。