一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

Associated Objects | Esoft Mobile

 ccccshq 2017-05-22

本文翻譯自NSHipster的文章Associated Objects。

1
#import <objc/runtime.h>

Objective-C開發(fā)者在遇到上面這條“咒語”相關(guān)的一些東西時,會不自覺的變的非常謹慎。一個主要原因是:弄亂Objective-C運行時可能會改變整個實現(xiàn)結(jié)構(gòu),因為所有的代碼都是運行在它之上的。

一方面:<objc/runtime.h>中的函數(shù)可以給應(yīng)用或者框架增加強大的新特性,這是通過其他方式不可能做到的。但另一方面:它會改變代碼的正常運行邏輯和所有與之交互的東西(通常伴隨著可怕的副作用)。

因而,這是我們認為進行這種魔鬼交易最大的恐懼點,下面來看一個NSHipster讀者問得最多的一個主題:associated objects。


Associated Objects(關(guān)聯(lián)對象)或者叫作關(guān)聯(lián)引用(Associative References),是作為Objective-C 2.0 運行時功能被引入到 Mac OS X 10.6 Snow Leopard(及iOS4)系統(tǒng)。與它相關(guān)在<objc/runtime.h>中有3個C函數(shù),它們可以讓對象在運行時關(guān)聯(lián)任何值:

  • objc_setAssociatedObject
  • objc_getAssociatedObject
  • objc_removeAssociatedObjects

為什么這幾個方法很有用呢?因為開發(fā)者可以通過它們在分類中給已存在的類中添加自定義屬性

NSObject+AssociatedObject.h

1
2
3
@interface NSObject (AssociatedObject)
@property (nonatomic, strong) id associatedObject;
@end

NSObject+AssociatedObject.m

1
2
3
4
5
6
7
8
9
10
@implementation NSObject (AssociatedObject)
@dynamic associatedObject;
- (void)setAssociatedObject:(id)object {
objc_setAssociatedObject(self, @selector(associatedObject), object, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
- (id)associatedObject {
return objc_getAssociatedObject(self, @selector(associatedObject));
}

通常推薦key使用static char類型——使用指針或許更好,key值是一個唯一的常量,并只在getters和setters方法內(nèi)部使用:

1
2
3
static char kAssociatedObjectKey;
objc_getAssociatedObject(self, &kAssociatedObjectKey);

然而,一個更簡單的方案是:直接使用選擇器(selector)。

因為SEL生成的時候就是一個唯一的常量,你可以使用 _cmd 作為objc_setAssociatedObject()的key。

—— Bill Bumgarner(@bbum) August28, 2009

關(guān)聯(lián)對象的特性

被關(guān)聯(lián)到對象的值根據(jù)使用的objc_AssociationPolicy類型不同表現(xiàn)出不同的特性:

Behavior 對應(yīng)的@property類型 描述
OBJC_ASSOCIATION_ASSIGN @property (assign) 或 @property(unsafe_unretained) 給關(guān)聯(lián)對象指定若引用
OBJC_ASSOCIATION_RETAIN_NONATOMIC @property (nonatomic, strong) 給關(guān)聯(lián)對象指定非原子的強引用
OBJC_ASSOCIATION_COPY_NONATOMIC @property (nonatomic, copy) 給關(guān)聯(lián)對象指定非原子的copy特性
OBJC_ASSOCIATION_RETAIN @property (atomic, strong) 給關(guān)聯(lián)對象指定原子的強引用
OBJC_ASSOCIATION_COPY @property (atomic, copy) 給關(guān)聯(lián)對象指定原子copy特性

通過OBJC_ASSOCIATION_ASSIGN分配的弱關(guān)聯(lián)對象并不是完全和weak修飾符引用一樣(對象初始化與釋放時被置空),反而更像是unsafe_unretained,所以你需要在訪問弱關(guān)聯(lián)對象時稍微注意一下。

根據(jù)WWDC2011,Session322對對象釋放時間的描述,associated objects清除在對象生命周期中很晚才執(zhí)行,通過被NSObject -dealloc方法調(diào)用的object_dispose()函數(shù)完成。

移除關(guān)聯(lián)對象

一個的方法是試圖在某個時刻調(diào)用objc_removeAssociatedObjects()函數(shù)來移除關(guān)聯(lián)對象,然而,根據(jù)蘋果文檔描述,你不大可能有需求要自己去調(diào)用:

這個函數(shù)的主要目的是很容易的讓對象恢復(fù)成它“原始狀態(tài)”,你不應(yīng)該使用它來移除關(guān)聯(lián)的對象,因為它也會移除掉包括其他地方加入的全部的關(guān)聯(lián)對象。所以一般你只需要通過調(diào)用objc_setAssociatedObject并傳入nil值來清除關(guān)聯(lián)值。

模式

  • 添加私有變量來幫助實現(xiàn)細節(jié) 。當拓展一個內(nèi)置類時,可能有必要跟蹤一些額外的狀態(tài),這是關(guān)聯(lián)對象最普遍的應(yīng)用場景。例如:AFNetworking中在UIImageView的分類中使用關(guān)聯(lián)對象來存儲一個請求操作對象(operation object),用于異步的從遠程獲取圖片。

  • 添加公共屬性來設(shè)置分類的特性 。有時候,通過添加一個屬性讓一個分類更加靈活,而不是作為函數(shù)參數(shù)。這種情況下,使用關(guān)聯(lián)對象作為一個公開的屬性是可接受的解決方案。還是拿前面AFNetworking的例子來說,UIImageView的分類中imageResponseSerializer屬性允許圖片視圖隨意的使用一個過濾器,或者在圖片請求并緩存之前就可以修改它的渲染。

  • 為KVO創(chuàng)建一個關(guān)聯(lián)的觀察者(observer)。當在一個分類中使用KVO的時候,推薦使用一個自定義的關(guān)聯(lián)對象作為觀察者,而不是對象自己觀察自己。

反模式

  • 在不必要的時候使用關(guān)聯(lián)對象。使用視圖時一個常見的情況是通過數(shù)據(jù)模型或一些復(fù)合的值來創(chuàng)建一個便利的方法設(shè)置填充字段或?qū)傩?。如果這些值在后面不會再被使用到,最好就不要使用關(guān)聯(lián)對象了。

  • 使用關(guān)聯(lián)對象來保存一個可以被推算出來的值。例如,有人可能想通過關(guān)聯(lián)對象存儲UITableViewCell上一個自定義accessoryView的引用,使用tableView:accessoryButtonTappedForRowWithIndexPath:cellForRowAtIndexPath:即可以達到要求。

  • 使用關(guān)聯(lián)對象來代替X。其中X代表下面的一些項:

    • 子類化,當使用繼承比使用組合更合適的時候。
    • Target-Action給響應(yīng)者添加交互事件。
    • 手勢識別,當target-action模式不夠用的時候。
    • 代理,當事件可以委托給其他對象。
    • 消息 & 消息中心使用低耦合的方式來廣播消息。

關(guān)聯(lián)對象應(yīng)該被當做最后的手段來使用(不得不用時才用),而不是為了尋求一個解決方案就行(事實上,分類本身就不應(yīng)該是解決問題優(yōu)先選擇的工具)。

像一些巧妙的伎倆、hack手段或者是變通的解決方案,人們總是傾向于創(chuàng)造機會來使用他們——特別是剛剛接觸他們時。盡可能的在理解并領(lǐng)悟之后再做出正確的方案,避免自己陷入一知半解的尷尬處境。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    尹人大香蕉一级片免费看| 国产一区二区三区四区中文| 色无极东京热男人的天堂| 91日韩欧美中文字幕| 99日韩在线视频精品免费| 午夜福利精品视频视频| 亚洲视频一区二区久久久| 亚洲男人的天堂就去爱| 日韩精品在线观看一区| 欧美精品亚洲精品一区| 东京热加勒比一区二区三区| 日韩中文高清在线专区| 日韩欧美第一页在线观看| 中文字幕亚洲精品在线播放| 色婷婷国产精品视频一区二区保健| 日本高清不卡一二三区| 日韩成人动画在线观看| 熟女乱一区二区三区丝袜| 日韩欧美三级视频在线| 亚洲成人黄色一级大片| 国产无摭挡又爽又色又刺激| 国产在线一区二区三区不卡| 日本二区三区在线播放| 午夜福利视频日本一区| 丰满人妻熟妇乱又乱精品古代| 久草视频这里只是精品| 91精品国产综合久久不卡| 熟女少妇久久一区二区三区| 亚洲国产成人久久一区二区三区| 黄色国产一区二区三区| 一区二区三区亚洲国产| 清纯少妇被捅到高潮免费观看| 99久久国产精品免费| 福利专区 久久精品午夜| 五月天婷亚洲天婷综合网| 国产亚洲系列91精品| 国产主播精品福利午夜二区| 99秋霞在线观看视频| 午夜久久久精品国产精品| 日韩精品少妇人妻一区二区| 好吊视频有精品永久免费|