iOS objective-C 語言特性

分類(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?
  1. Key value observing
  2. 是Objective - C對(duì)觀察者模式的又一個(gè)實(shí)現(xiàn)
  3. 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-coding

  • KVC是否破壞了面向?qū)ο蟮木幊趟枷耄?br> 是的,應(yīng)為在外部可以修改

  • Accessor Method是否存在訪問器
    getKey
    isKey
    key

  • Instance 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)置為nil

  • weak指針為什么被釋放之后會(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)地為分類添加成員變量。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 先以一圖總結(jié): 以下:「attribute(s)」,「特性」是指同一事物(都指@property后面括號(hào)內(nèi)的單詞)...
    AntonyWong閱讀 14,005評(píng)論 9 47
  • 1. load 與 initialize load:是當(dāng)類或分類被添加到 Objective-C runtime ...
    杰克道長閱讀 1,470評(píng)論 0 3
  • 前言 話說 iOS 面試怎么離得開 Objective-C 這蘋果公司使用的劃時(shí)代的語言呢?我貼出維基百科的一段o...
    唐師兄閱讀 793評(píng)論 0 7
  • 1、簡(jiǎn)述你項(xiàng)目中常用的設(shè)計(jì)模式。它們有什么優(yōu)缺點(diǎn)?常用的設(shè)計(jì)模式有:代理、觀察者、單例。(1)單例:它是用來限制一...
    LZM輪回閱讀 1,146評(píng)論 0 6
  • 面試筆試都是必考語法知識(shí)的。請(qǐng)認(rèn)真復(fù)習(xí)和深入研究OC。 Objective-C 方法和選擇器有何不同?(Diffe...
    b485c88ab697閱讀 5,871評(píng)論 0 35

友情鏈接更多精彩內(nèi)容