分類(Category)
用分類做什么?
- 聲明私有方法,只把投文件放在宿主.m文件中,對(duì)外不堡壘
- 分解體積龐大的類
- Framework的私有方法公開化
用分類的特點(diǎn)(和擴(kuò)展的區(qū)別)?
在運(yùn)行時(shí)決議(擴(kuò)展不是)
在運(yùn)行時(shí),通過Runtime給到宿主類可以為系統(tǒng)類添加分類(擴(kuò)展不可以)
源碼分析
用分類可以什么內(nèi)容?
- 實(shí)例方法
- 類方法
- 協(xié)議
- 屬性
沒有添加了實(shí)例變量,只是聲明了get和set方法
用關(guān)聯(lián)對(duì)性才能生成實(shí)例變量
runtime680源代碼在蘋果官方網(wǎng)站上有,可以看到分類的結(jié)構(gòu)體。
- 加載調(diào)用棧
https://blog.csdn.net/ochenmengo/article/details/104791008?spm=1001.2014.3001.5501
最后編譯的分類的方法會(huì)覆蓋掉之前的,倒序遍歷的。
分類的同名方法會(huì)“覆蓋“,原類方法仍然存在(返回了)
名字相同的分類會(huì)引起編譯的報(bào)錯(cuò)
關(guān)聯(lián)對(duì)象
怎么給分類添加”成員變量“?
不能再分類聲明和實(shí)現(xiàn)時(shí)候添加成員變量,但是通過關(guān)聯(lián)對(duì)象的技術(shù)來給分類實(shí)現(xiàn)達(dá)到給分類添加成員變量(鮮果上)關(guān)聯(lián)對(duì)象是被添加到哪里了呢?
https://blog.csdn.net/ochenmengo/article/details/104813322?spm=1001.2014.3001.5501
擴(kuò)展
擴(kuò)展是做什么?
私有屬性(可以不對(duì)子類暴漏)
聲明私有方法(方便閱讀,沒有太大的作用)
私有成員變量(放在.m文件中,和生命私有屬性是有區(qū)別的)分類和擴(kuò)展的區(qū)別是什么?
擴(kuò)展是編譯時(shí)決議(分類是運(yùn)行時(shí))
只有聲明沒有實(shí)現(xiàn)(寄生在在宿主的.m上)
不能給系統(tǒng)類添加擴(kuò)展(分類可以給系統(tǒng)類添加)
代理
準(zhǔn)確的說是一種軟件設(shè)計(jì)模式
iOS當(dāng)中用@Preoerty來實(shí)現(xiàn)
一對(duì)一(通知一對(duì)多)
協(xié)議可以定義什么?
方法和屬性協(xié)議中聲明的方法和屬性代理方必須實(shí)現(xiàn)嗎?
不一定 optional 和 required
- 一般聲明為weak以規(guī)避循環(huán)引用
代理方是強(qiáng)引用委托方面的
委托方是弱持有代理方的
通知(NS開頭的,沒有開放出來源碼)
通知的的特點(diǎn)
是使用觀察者模式實(shí)現(xiàn)的用于跨層傳遞消息的機(jī)制
一對(duì)多如何實(shí)現(xiàn)通知機(jī)制?
(假如讓你設(shè)計(jì),你會(huì)怎么實(shí)現(xiàn)通知的機(jī)制的?)
https://blog.csdn.net/ochenmengo/article/details/104902022?spm=1001.2014.3001.5501
KVO
- 什么是KVO?
- Key value observing
- 是Objective - C對(duì)觀察者模式的又一個(gè)實(shí)現(xiàn)
- Apple 使用了isa混寫(isa - swizzling)來實(shí)現(xiàn)KVO。
KVO的實(shí)現(xiàn)機(jī)制是什么的?
通過KVC設(shè)置的話是否能夠生效?為什么能實(shí)現(xiàn)呢?
能,KVC出發(fā)了setter方法,setter方法已經(jīng)被運(yùn)行時(shí)動(dòng)態(tài)創(chuàng)建的子類重寫了。通過對(duì)成員變量直接賦值的話是沒有辦法被觀察的。
可以在直接賦值的方法里面仿寫做到,手動(dòng)KVO
- 總結(jié)
使用Setter方法改變值會(huì)觸發(fā)KVO
使用KVC方法設(shè)置值也會(huì)觸發(fā)KVO
成員變量直接修改需要用手動(dòng)添加KVO的方法
KVC
什么是KVC?
鍵值編碼,Key-Value-codingKVC是否破壞了面向?qū)ο蟮木幊趟枷耄?br> 是的,應(yīng)為在外部可以修改
Accessor Method是否存在訪問器
getKey
isKey
keyInstance var
_key
_isKey
isKey
key
屬性關(guān)鍵字的分類
讀寫權(quán)限的
readOnly
readWrite(默認(rèn))原子性的
atcomic(默認(rèn)的,可以保證賦值和獲取是線程安全的,這里的賦值只隊(duì)成員變量的獲取和賦值,不是操作和訪問。atomic數(shù)組添加和移除對(duì)象是沒有atcomic負(fù)責(zé)不了的,既不安全)
nonatomic
- 引用計(jì)數(shù)的
retain(MRC)/strong(ARC)
assign(ARC) / unsafe_unretained(基本退出舞臺(tái)了)
weak
copy
assign
修飾基本數(shù)據(jù)類型int BOOL等
修飾對(duì)象類型時(shí)候,不改變其引用計(jì)數(shù)
會(huì)產(chǎn)生懸垂指針的weak
不改變修飾對(duì)象的引用計(jì)數(shù)
所指向的對(duì)象被釋放之后會(huì)自動(dòng)置為nilweak指針為什么被釋放之后會(huì)成為nil呢?
內(nèi)存管理掌機(jī)
*copy
*淺拷貝
對(duì)內(nèi)存地址復(fù)制,沒有開辟新內(nèi)存,引用計(jì)數(shù)會(huì)+1
*深拷貝
開辟了新的內(nèi)存空間,元內(nèi)存的引用計(jì)數(shù)不會(huì)+1
*深淺拷貝
是否開辟了新的內(nèi)存空間
引用計(jì)數(shù)是否會(huì)加1
- 總結(jié)
retain修飾的屬性怎么重寫setter方法
簡(jiǎn)述分類實(shí)現(xiàn)原理?
KVO的實(shí)現(xiàn)原理?
能否為分類添加成員變量?
https://blog.csdn.net/ochenmengo/article/details/104905085?spm=1001.2014.3001.5501
OC語言特性面試問題總結(jié)
1. 簡(jiǎn)述分類的實(shí)現(xiàn)原理
相信大家在前面的章節(jié)學(xué)習(xí)過分類的實(shí)現(xiàn)原理后,應(yīng)該已經(jīng)有了明確的答案。這里做一個(gè)簡(jiǎn)單的總結(jié)。
分類的實(shí)現(xiàn)原理是由運(yùn)行時(shí)來決議的。如果不同分類中包含同名的方法,最終生效的分類方法取決于最后參與編譯的那個(gè)分類。當(dāng)兩個(gè)分類中有同名方法時(shí),最后參與編譯的分類中的同名方法會(huì)最終生效。
覆蓋宿主類方法
如果分類中所添加的方法恰好是宿主類中的某個(gè)方法,分類中的方法會(huì)覆蓋同名的宿主類方法。這里的“覆蓋”并不是完全替換,而是在消息傳遞的過程中,系統(tǒng)會(huì)優(yōu)先查找數(shù)組中靠前的元素。如果找到了同名方法,就會(huì)調(diào)用該方法。但實(shí)際上,宿主類中的同名方法仍然存在,我們可以通過一些手段來調(diào)用原有類的同名方法。
2. KVO的實(shí)現(xiàn)原理
接下來,我們來看一下 KVO 的實(shí)現(xiàn)原理。
KVO 這個(gè)面試問題的答案可以總結(jié)為以下兩點(diǎn):
- KVO是系統(tǒng)對(duì)觀察者模式的一種實(shí)現(xiàn)。
-
KVO運(yùn)用了 ISA 混寫技術(shù):在運(yùn)行時(shí),KVO 會(huì)為某個(gè)類動(dòng)態(tài)添加一個(gè)子類,重寫其
setter方法,同時(shí)將原有類的ISA指針指向新創(chuàng)建的子類。
這兩點(diǎn)是回答 KVO 實(shí)現(xiàn)原理的核心內(nèi)容,掌握了這兩點(diǎn),基本可以應(yīng)對(duì)這類面試題。
3. 能否為分類添加實(shí)例變量
這個(gè)問題考察的是你對(duì)“關(guān)聯(lián)對(duì)象”技術(shù)的理解。
實(shí)際上,我們可以通過關(guān)聯(lián)對(duì)象的技術(shù)為分類添加成員變量。雖然在分類中不能直接聲明和實(shí)現(xiàn)實(shí)例變量,但通過關(guān)聯(lián)對(duì)象的機(jī)制,我們可以動(dòng)態(tài)地為分類添加成員變量。