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對象