EmptyNotice
使用runtime被頁(yè)面添加空白提示圖
實(shí)現(xiàn)思路:使用Objective-C 中 Associated Objects,給view(關(guān)聯(lián)者)關(guān)聯(lián)一個(gè)空白關(guān)聯(lián)對(duì)象(空白展示圖),來(lái)達(dá)到添加空白圖的效果;
主要使用到的方法:
objc_setAssociatedObject(id _Nonnull object, const void * _Nonnull key, id _Nullable value, objc_AssociationPolicy policy)
objc_getAssociatedObject(id _Nonnull object, const void * _Nonnull key)
解釋:
- objc_setAssociatedObject作用:用于給對(duì)象添加關(guān)聯(lián)對(duì)象,傳入 nil 則可以移除已有的關(guān)聯(lián)對(duì)象;
它有四個(gè)參數(shù),分別表示 源對(duì)象,關(guān)鍵字,關(guān)聯(lián)的對(duì)象和一個(gè)關(guān)聯(lián)策略;
- id object 表示關(guān)聯(lián)者,是一個(gè)對(duì)象,變量名理所當(dāng)然也是object
- id value 表示被關(guān)聯(lián)者,變量名是value,它要關(guān)聯(lián)到object上的。
- 關(guān)鍵字是一個(gè)void類(lèi)型的指針。每一個(gè)關(guān)聯(lián)的關(guān)鍵字必須是唯一的。通常都是會(huì)采用靜態(tài)變量來(lái)作為關(guān)鍵字。
- 關(guān)聯(lián)策略表明了相關(guān)的對(duì)象是通過(guò)賦值,保留引用還是復(fù)制的方式進(jìn)行關(guān)聯(lián)的;還有這種關(guān)聯(lián)是原子的還是非原子的。這里的關(guān)聯(lián)策略和聲明屬性時(shí)的很類(lèi)似。
這種關(guān)聯(lián)策略是通過(guò)使用預(yù)先定義好的常量來(lái)表示的。
這里有五種策略:
OBJC_ASSOCIATION_ASSIGN = 0, 弱引用關(guān)聯(lián)對(duì)象,等價(jià)于屬性的assign和unsafe_unretained
OBJC_ASSOCIATION_RETAIN_NONATOMIC = 1, 強(qiáng)引用關(guān)聯(lián)對(duì)象,且為非原子操作,等價(jià)于屬性的strong
OBJC_ASSOCIATION_COPY_NONATOMIC = 3, 復(fù)制關(guān)聯(lián)對(duì)象,且為非原子操作,等價(jià)于屬性的copy
OBJC_ASSOCIATION_RETAIN = 01401, 強(qiáng)引用關(guān)聯(lián)對(duì)象,且為原子操作,等價(jià)于屬性的strong
OBJC_ASSOCIATION_COPY = 01403 復(fù)制關(guān)聯(lián)對(duì)象,且為原子操作,等價(jià)于屬性的copy
對(duì)于2和4,3和5策略,唯一區(qū)別是是都具有原子性;
- objc_getAssociatedObject作用是:根據(jù)關(guān)聯(lián)字獲取關(guān)聯(lián)對(duì)象;
- id object 表示關(guān)聯(lián)者,是一個(gè)對(duì)象;
- key 關(guān)聯(lián)對(duì)象的關(guān)鍵字
PS:還有一個(gè)方法不常用,objc_removeAssociatedObjects(id _Nonnull object),這個(gè)方法用來(lái)移除關(guān)聯(lián)者(id object)的所有關(guān)聯(lián)對(duì)象,將該對(duì)象恢復(fù)成“原始”狀態(tài)。這樣做就很有可能把別人添加的關(guān)聯(lián)對(duì)象也一并移除,這并不是我們所希望的。
本demo提供了一個(gè)很簡(jiǎn)單的思路去實(shí)現(xiàn)了我們項(xiàng)目中的空白圖的展示,如果與你的業(yè)務(wù)不符合,你可以基于這個(gè)思路進(jìn)行封裝,整體來(lái)看還是比較輕量化,無(wú)侵入性和容易維護(hù)的.
在項(xiàng)目中的效果圖
Github:https://github.com/SpringAndSummer/EmptyNotice