iOS基礎(chǔ)知識點(diǎn)(網(wǎng)絡(luò)摘抄)

1.父類實(shí)現(xiàn)深拷貝時,子類如何實(shí)現(xiàn)深拷貝。父類沒有實(shí)現(xiàn)深拷貝時,子類如何實(shí)現(xiàn)深拷貝?

? ? ? 深拷貝同淺拷貝的區(qū)別:淺拷貝是指針拷貝,對一個對象進(jìn)行淺拷貝,相當(dāng)于對指向?qū)ο蟮闹羔樳M(jìn)行復(fù)制,產(chǎn)生一個新的指向這個對象的指針,就是有兩個指針指向同一個對象。這個對象銷毀后兩個指針都應(yīng)該置空。深拷貝是對一個對象進(jìn)行拷貝,相當(dāng)于對對象進(jìn)行復(fù)制,產(chǎn)生一個新的對象,那么就有兩個指針分別指向兩個對象。當(dāng)一個對象改變或者被銷毀后拷貝出來的新的對象不受影響。

? ? ? ?實(shí)現(xiàn)深拷貝需要實(shí)現(xiàn)NSCoying協(xié)議,實(shí)現(xiàn)- (id)copyWithZone:(NSZone *)zone 方法。當(dāng)對一個property屬性含有copy修飾符的時候,在進(jìn)行賦值操作的時候?qū)嶋H上就是調(diào)用這個方法。父類實(shí)現(xiàn)深拷貝之后,子類只要重寫copyWithZone方法,在方法內(nèi)部調(diào)用父類的copyWithZone方法,之后實(shí)現(xiàn)自己的屬性的處理。父類沒有實(shí)現(xiàn)深拷貝,子類除了需要對自己的屬性進(jìn)行處理,還要對父類的屬性進(jìn)行處理。

2.KVO,NSNotification,delegate及block區(qū)別?

? ? ? ?KVO就是cocoa框架實(shí)現(xiàn)的觀察者模式,一般同KVC搭配使用,通過KVO可以監(jiān)測一個值的變化,比如View的高度變化。是一對多的關(guān)系,一個值的變化會通知所有的觀察者。

? ? ? ?KVO一般的使用場景是數(shù)據(jù),需求是數(shù)據(jù)變化,比如股票價格變化,我們一般使用KVO(觀察者模式)。delegate一般的使用場景是行為,需求是需要別人幫我做一件事情,比如買賣股票,我們一般使用delegate。

? ? ? ?NSNotification是通知,也是一對多的使用場景。在某些情況下,KVO和NSNotification是一樣的,都是狀態(tài)變化之后告知對方。NSNotification的特點(diǎn),就是需要被觀察者先主動發(fā)出通知,然后觀察者注冊監(jiān)聽后再來進(jìn)行響應(yīng),比KVO多了發(fā)送通知的一步,但是其優(yōu)點(diǎn)是監(jiān)聽不局限于屬性的變化,還可以對多種多樣的狀態(tài)變化進(jìn)行監(jiān)聽,監(jiān)聽范圍廣,使用也更靈活。

? ? ? ?Notification一般是進(jìn)行全局通知,比如利好消息一出,通知大家去買入。delegate是強(qiáng)關(guān)聯(lián),就是委托和代理雙方互相知道,你委托別人買股票你就需要知道經(jīng)紀(jì)人,經(jīng)紀(jì)人也不要知道自己的顧客。Notification是弱關(guān)聯(lián),利好消息發(fā)出,你不需要知道是誰發(fā)的也可以做出相應(yīng)的反應(yīng),同理發(fā)消息的人也不需要知道接收的人也可以正常發(fā)出消息。

? ? ? ?delegate 是代理,就是我不想做的事情交給別人做。比如狗需要吃飯,就通過delegate通知主人,主人就會給他做飯、盛飯、倒水,這些操作,這些狗都不需要關(guān)心,只需要調(diào)用delegate(代理人)就可以了,由其他類完成所需要的操作。所以delegate是一對一關(guān)系。

? ? ? ?block是delegate的另一種形式,是函數(shù)式編程的一種形式。使用場景跟delegate一樣,相比delegate更靈活,而且代理的實(shí)現(xiàn)更直觀。

3.將一個函數(shù)在主線程執(zhí)行的4種方法

1.GCD方法:通過向主線程隊(duì)列發(fā)送一個block塊,使block里的方法可以在主線程中執(zhí)行。

dispatch_async(dispatch_get_main_queue(), ^{

//需要執(zhí)行的方法

});

2.NSOperation 方法

NSOperationQueue *mainQueue = [NSOperationQueue mainQueue];??

//主隊(duì)列

NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{

//需要執(zhí)行的方法

}];

[mainQueue addOperation:operation];

3.NSThread 方法

[self performSelector:@selector(method) onThread:[NSThread mainThread] withObject:nil waitUntilDone:YES modes:nil];

[self performSelectorOnMainThread:@selector(method) withObject:nil waitUntilDone:YES];

[[NSThread mainThread] performSelector:@selector(method) withObject:nil];

4.RunLoop方法

[[NSRunLoop mainRunLoop] performSelector:@selector(method) withObject:nil];

4.如何重寫類方法?

1、在子類中實(shí)現(xiàn)一個同基類名字一樣的靜態(tài)方法

2、在調(diào)用的時候不要使用類名調(diào)用,而是使用[self class]的方式調(diào)用。原理,用類名調(diào)用是早綁定,在編譯期綁定,用[self class]是晚綁定,在運(yùn)行時決定調(diào)用哪個方法。

5.NSTimer創(chuàng)建后,會在哪個線程運(yùn)行?

1.用scheduledTimerWithTimeInterval創(chuàng)建的,在哪個線程創(chuàng)建就會被加入哪個線程的RunLoop中就運(yùn)行在哪個線程.

2.自己創(chuàng)建的Timer,加入到哪個線程的RunLoop中就運(yùn)行在哪個線程。

6.id 和 NSObject*的區(qū)別?

id是一個 objc_object 結(jié)構(gòu)體指針,定義是?typedef struct objc_object *id.

id可以理解為指向?qū)ο蟮闹羔?。所有oc的對象 id都可以指向,編譯器不會做類型檢查,id調(diào)用任何存在的方法都不會在編譯階段報錯,當(dāng)然如果這個id指向的對象沒有這個方法,該崩潰還是會崩潰的。

NSObject *指向的必須是NSObject的子類,調(diào)用的也只能是NSObjec里面的方法否則就要做強(qiáng)制類型轉(zhuǎn)換。

不是所有的OC對象都是NSObject的子類,還有一些繼承自NSProxy。NSObject *可指向的類型是id的子集。

7.iOS 核心框架?

1.CoreAnimation ??2.CoreGraphics ? ?3.CoreLocation ? ?4.AVFoundation ? ?5.Foundation

8.iOS核心機(jī)制?

1.UITableView 重用 ?

2.ObjC內(nèi)存管理;自動釋放池,ARC如何實(shí)現(xiàn)

3.runloop

4.runtime

5.Block的定義、特性、內(nèi)存區(qū)域、如何實(shí)現(xiàn)

6.Responder Chain

7.NSOperation

8.GCD

9.內(nèi)存分區(qū)情況?

(1)代碼區(qū):存放函數(shù)二進(jìn)制代碼

(2)數(shù)據(jù)區(qū):系統(tǒng)運(yùn)行時申請內(nèi)存并初始化,系統(tǒng)退出時由系統(tǒng)釋放。存放全局變量、靜態(tài)變量、常量

(3)堆區(qū):通過malloc等函數(shù)或new等操作符動態(tài)申請得到,需程序員手動申請和釋放

(4)棧區(qū):函數(shù)模塊內(nèi)申請,函數(shù)結(jié)束時由系統(tǒng)自動釋放。存放局部變量、函數(shù)參數(shù)

10.什么情況使用 weak 關(guān)鍵字,相比 assign 有什么不同?

1)在ARC中,在有可能出現(xiàn)循環(huán)引用的時候,往往要通過讓其中一端使用weak來解決,比如:delegate代理屬性。

2)自身已經(jīng)對它進(jìn)行一次強(qiáng)引用,沒有必要再強(qiáng)引用一次,此時也會使用weak,自定義IBOutlet控件屬性一般也使用weak;當(dāng)然,也可以使用strong。

不同點(diǎn):

1)weak 此特質(zhì)表明該屬性定義了一種“非擁有關(guān)系” (nonowning relationship)。為這種屬性設(shè)置新值時,設(shè)置方法既不保留新值,也不釋放舊值,此特質(zhì)同assign類似。?然而在屬性所指的對象遭到摧毀時,屬性值也會清空(nil out)。 而 assign 的“設(shè)置方法”只會執(zhí)行針對“純量類型” (scalar type,例如 CGFloat 或 NSlnteger 等)的簡單賦值操作。

2)assigin 可以用非OC對象,而weak必須用于OC對象

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

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

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