10.readwrite,readonly,assign,retain,copy,nonatomic屬性的作用?
- readwrite是可讀可寫(xiě)特性,需要生成getter和setter方法;
- readonly是只讀特性,只會(huì)生成getter方法,不會(huì)生成setter方法,不希望屬性在類(lèi)外改變;
- assign是賦值特性,setter方法將傳入?yún)?shù)賦值給實(shí)例變量;僅設(shè)置變量時(shí);assign用于簡(jiǎn)單數(shù)據(jù)類(lèi)型,如NSInteger,double,bool;
- retain表示持有特性,setter方法將傳入?yún)?shù)先保留,再賦值,傳入?yún)?shù)的引用計(jì)數(shù)retaincount會(huì)+1;
- copy表示賦值特性,setter方法將傳入對(duì)象賦值一份,需要完全一份新的變量時(shí);
- nonatomic非原子操作,決定編譯器生成的setter getter是否是原子操作;
- atomic表示多線程安全,一般使用 nonatomic;
11.簡(jiǎn)述NotificationCenter、KVC、KVO、Delegate?并說(shuō)明它們之間的區(qū)別?(重點(diǎn))
- KVO(Key-Value-Observing):一對(duì)多,觀察者模式,鍵值觀察機(jī)制,它提供了觀察某一屬性變化的方法,加大簡(jiǎn)化了代碼;
- KVC(Key-Value-Coding):是鍵值編碼,一個(gè)對(duì)象在調(diào)用setValue的時(shí)候,
a. 檢查是否存在相應(yīng)的key的set方法,存在就調(diào)用set方法;
b. set方法不存在,就查找_key的成員變量是否存在,存在就直接賦值;
c. 如果_key沒(méi)找到,就查找相同名稱(chēng)的key,存在就賦值;
如果沒(méi)有就調(diào)用valueForUnderfinedKey和setValue: forUndefinedKey; - Delegate:通常發(fā)送者和接受者是直接一對(duì)一的關(guān)系,
a. 代理的目的是改變或傳遞控制鏈。允許一個(gè)類(lèi)在某些特定時(shí)刻通知到其他類(lèi),而不需要獲取到那些類(lèi)的指針。
b. 可以減少框架復(fù)雜度,消息的發(fā)送者(sender)告知接收者(receiver)某個(gè)事件將要發(fā)生,delegate同意然然后發(fā)送者響應(yīng)事件,delegate機(jī)制機(jī)制使得接收者的行為; - Notification:觀察者模式,通常發(fā)送者和接受者的關(guān)系的關(guān)系是間接的多對(duì)多關(guān)系,消息的發(fā)送者告知接收者事件已經(jīng)發(fā)生或者將要發(fā)送,僅此而已,接收者并不能反過(guò)來(lái)影響發(fā)送者的行為;
區(qū)別:
- 效率肯定是delegate比NSNotification高;
- delegate方法比notification更加直接,需要關(guān)注返回值,所以delegate方法往往包含should這個(gè)很傳神的詞。相反的,notification最大的特色就是不關(guān)心結(jié)果,所以notification往往用did這個(gè)詞;
- 兩個(gè)模塊之間聯(lián)系不是很緊密,就用notification傳值,例如多線程之間傳值用notification;
- delegate只是一種較為簡(jiǎn)單的回調(diào),且主要用在一個(gè)模塊中,例如底層功能完成了,需要把一些值傳到上層去,就是事先把上層的函數(shù)通過(guò)delegate傳到底層,然后在底層call這個(gè)delegate,它們都在一個(gè)模塊中,完成一個(gè)功能,例如說(shuō)NavigationController 從B界面到A界面 點(diǎn)擊=返回按鈕(調(diào)用popViewController方法)可以用delegate比較好;
12.懶加載(What is laze loading ?)
- 就是懶加載只在用到的時(shí)候才去初始化,也可以理解成延時(shí)加載。一個(gè)簡(jiǎn)單的例子:tableView中圖片的加載顯示了,一個(gè)延時(shí)加載,避免內(nèi)存過(guò)高,一個(gè)異步加載,避免線程堵塞提高用戶體驗(yàn)
13.OC有多繼承嗎?沒(méi)有的話可以用什么方法代替?
- 多繼承即一個(gè)子類(lèi)可以有多個(gè)父類(lèi),它繼承了多個(gè)父類(lèi)的特性;
- Object-c的類(lèi)沒(méi)有多繼承,只支持單繼承,如果要實(shí)現(xiàn)多繼承的話,可以通過(guò)類(lèi)型別和協(xié)議的方式來(lái)實(shí)現(xiàn);
*protocol(協(xié)議)可以實(shí)現(xiàn)多個(gè)接口,通過(guò)實(shí)現(xiàn)多個(gè)接口可以完成多繼承; - Category(類(lèi)別)一般使用分類(lèi),用Category去重寫(xiě)類(lèi)的方法,僅對(duì)本Category有效,不會(huì)影響到其他類(lèi)與原有類(lèi)的關(guān)系;
14.分別描述類(lèi)別(categories)和延展(extensions)是什么?以及兩者的區(qū)別?繼承和類(lèi)別在實(shí)現(xiàn)中有何區(qū)別?為什么Category只能為對(duì)象添加方法,卻不能添加成員變量?
- 類(lèi)別:在沒(méi)有原類(lèi).m文件的基礎(chǔ)上,給該類(lèi)添加方法;
- 延展:一種特殊形式的類(lèi)別,主要在一個(gè)類(lèi)的.m文件里聲明和實(shí)現(xiàn)延展的作用,就是給某類(lèi)添加私有方法或是私有變量;
- 兩個(gè)的區(qū)別:
a. 延展可以添加屬性并且它添加的方法是必須要實(shí)現(xiàn)的,延展可以認(rèn)為是一個(gè)私有的類(lèi)目;
b. 類(lèi)別可以在不知道,不改變?cè)瓉?lái)代碼的情況下往里面添加新的方法,只能添加,不能刪除修改;
c. 并且如果類(lèi)別和原來(lái)類(lèi)中的方法名稱(chēng)產(chǎn)生名稱(chēng)沖突,則類(lèi)別將覆蓋原來(lái)的方法,因?yàn)轭?lèi)別具有更高的優(yōu)先級(jí)別;
d. 繼承可以增加,修改刪除方法,添加屬性; - Category只能為對(duì)象添加方法,卻不能添加成員變量的原因:如果可以添加成員變量,添加的成員變量沒(méi)有辦法初始化;