iOS面試基礎(chǔ)一

#父類實(shí)現(xiàn)深拷貝時(shí),子類如何實(shí)現(xiàn)深度拷貝.父類沒(méi)有實(shí)現(xiàn)深拷貝時(shí),子類如何實(shí)現(xiàn)深度拷貝.#

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

(2)實(shí)現(xiàn)深拷貝需要實(shí)現(xiàn)NSCoying協(xié)議, 實(shí)現(xiàn)- (id)copyWithZone:(NSZone *)zone 方法.當(dāng)對(duì)一個(gè)property屬性含有copy修飾符的時(shí)候, 在進(jìn)行賦值操作的時(shí)候?qū)嶋H上就是調(diào)用這個(gè)方法.

(3)父類實(shí)現(xiàn)深拷貝之后, 子類只要重寫(xiě)copyWithZone方法, 在方法內(nèi)部調(diào)用父類的copyWithZone方法,之后實(shí)現(xiàn)自己的屬性的處理

(4)父類沒(méi)有實(shí)現(xiàn)深拷貝, 子類除了需要對(duì)自己的屬性進(jìn)行處理, 還要對(duì)父類的屬性進(jìn)行處理.>

#KVO, NSNotification, delegate及block區(qū)別

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

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

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

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

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

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

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

<(1) GCD方法, 通過(guò)向主線程隊(duì)列發(fā)送一個(gè)block塊, 使block里的方法可以在主線程中執(zhí)行.dispatch_asyanc(dispatch_get_main_queue( ), ^{ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

? ? ? ? ? ? ? ? ? 需要執(zhí)行的方法 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? });

(2) NSOperation 方法

NSOperationQueue *mainQueue = [NSOperationQueue mainQueue]; ? 主隊(duì)列?

NSBlockOperation *operation = [NSBlockOperation blockOpertionWithBlock:^{

? ? ? 需要執(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];

(4) RunLoop方法

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

#如何讓計(jì)時(shí)器調(diào)用一個(gè)類方法#

<(1) 計(jì)時(shí)器只能調(diào)用實(shí)例方法,但是可以在這個(gè)實(shí)例方法里面調(diào)用靜態(tài)方法.

? ?(2) 使用計(jì)時(shí)器需要注意, 計(jì)時(shí)器一定要加入RunLopp中, 并且選好model才能運(yùn)行.scheduleTimerWithTimeInterval方法創(chuàng)建一個(gè)計(jì)時(shí)器并加入到RunLoop中所以可以直接使用.

? ?(3) 如果計(jì)時(shí)器的reoeats選擇YES說(shuō)明這個(gè)計(jì)時(shí)器會(huì)重復(fù)執(zhí)行, 一定要在合適的時(shí)機(jī)調(diào)用計(jì)時(shí)器的invalid. 不能在dealloc中調(diào)用,因?yàn)橐坏┰O(shè)置為repeats 為YES, 計(jì)時(shí)器會(huì)強(qiáng)持有self, 導(dǎo)致dealloc永遠(yuǎn)都不會(huì)被調(diào)用,這個(gè)類就永遠(yuǎn)無(wú)法被釋放. 比如可以在viewDidDisappear中調(diào)用, 這樣當(dāng)類需要被回收的時(shí)候就可以正常進(jìn)入dealloc中了.

[NSTimer scheduledTimerWithTimerInterval:1 ?target:self ? selector:@selector(timerMethod ) ?userInfo:nil repeats:YES];

- (void)timerMethod

{ ? ? ??

? ? ? ? ? ? ?調(diào)用類方法

? ? ? ? ? ? ?[[self class] staticMethod];

}

- (void)invalid

{

? ? ? ? ? [timer invalid];?

? ? ? ? ? ? tiemr = nil ;

}>

#如何重寫(xiě)類方法#

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

(2) 在調(diào)用的時(shí)候不要使用類名調(diào)用, 而是使用[self class]的方式調(diào)用. 原理, 用類名調(diào)用是早綁定, 在編譯期綁定, ?用[self class] 是晚綁定, 在運(yùn)行時(shí)決定調(diào)用你是個(gè)方法.>

#NSTimer創(chuàng)建后, 會(huì)在哪個(gè)線程運(yùn)行#

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

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

#id和NSObject *的區(qū)別#

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

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

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

(4) 不是所有的OC對(duì)象都是NSObject的子類, 還有一些是繼承自NSProxy.NSObject *可以指向的類型是id的子集.>

#iOS 核心框架#

< (1) CoreAnimation

? ?(2) CoreGraphics

? ?(3) CoreLocation

? ?(4) AVFoundation

? ?(5) Foundation>

#iOS 核心機(jī)制

<(1) UITableView 的重用機(jī)制

? (2) ObjC內(nèi)存管理機(jī)制; 自動(dòng)釋放池, ARC如何實(shí)現(xiàn)

? (3) RunLoop 的運(yùn)行機(jī)制

? (4) RunRime 的運(yùn)行機(jī)制

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

? (6) Responder Chain

? (7) NSOperation

? (8)GCD>

#數(shù)據(jù)結(jié)構(gòu)#

<(1) 8大排序算法

? (2) ?二叉樹(shù)實(shí)現(xiàn)

? (3) ?二分查找實(shí)現(xiàn)>

#面向?qū)ο缶幊?

<(1) 封裝.繼承.多態(tài)

? (2) 設(shè)計(jì)模式6個(gè)原則

? (3) 設(shè)計(jì)一個(gè)類的功能, 如何劃分類的權(quán)利 (單一職責(zé))

? (4) 接口隔離

? (5) 如果有一個(gè)鳥(niǎo)類, 有飛的動(dòng)作, 一個(gè)鴕鳥(niǎo)繼承它是合適的嗎(里氏替換)

? (6) 類之間的依賴如何依賴耦合度最小(依賴倒轉(zhuǎn))(高層依賴低層,低層不能依賴高層.依賴接口,不能依賴具體的類.)

? (7) 如果A要調(diào)用C函數(shù), 但C是B的成員類, 應(yīng)該如何設(shè)計(jì)? (迪米特法則)

? (8) 如何設(shè)計(jì)類, 能做到只增加代碼, 而不修改代碼,有哪些經(jīng)驗(yàn) (開(kāi)放封閉)通過(guò)設(shè)計(jì)模式解決.>

#計(jì)算機(jī)技術(shù)#

<(1) 計(jì)算機(jī)網(wǎng)絡(luò): TCP/TP , HTTPCDN, SPDY

? (2) 計(jì)算機(jī)安全: RSA, AES, DES

? (3) 操作系統(tǒng): 線程, 進(jìn)程, 堆棧, 死鎖, 調(diào)度算法>

#iOS新特性 ?新技術(shù)#

<(1) iOS7 UIDynamic , SpritKit , 新布局, 扁平化

? (2) iOS8 應(yīng)用程序擴(kuò)展, HealthKit, SceneKit, CoreLocation, TouchID, PhotoKit

? (3) iOS9?

? (4) Apple Watch>

#第三方庫(kù)#

<(1) SDWebImage

? ?(2) AFNetwork

? ?(3) JSONKit(已經(jīng)不用了)

? ?(4) wax>

最后編輯于
?著作權(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)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 父類實(shí)現(xiàn)深拷貝時(shí),子類如何實(shí)現(xiàn)深度拷貝。父類沒(méi)有實(shí)現(xiàn)深拷貝時(shí),子類如何實(shí)現(xiàn)深度拷貝。? 深拷貝同淺拷貝的區(qū)別:淺拷...
    JonesCxy閱讀 1,202評(píng)論 1 7
  • ? 深拷貝同淺拷貝的區(qū)別:淺拷貝是指針拷貝,對(duì)一個(gè)對(duì)象進(jìn)行淺拷貝,相當(dāng)于對(duì)指向?qū)ο蟮闹羔樳M(jìn)行復(fù)制,產(chǎn)生一個(gè)新的指向...
    WSGNSLog閱讀 1,391評(píng)論 0 1
  • 1. 父類實(shí)現(xiàn)深拷貝時(shí),子類如何實(shí)現(xiàn)深度拷貝。父類沒(méi)有實(shí)現(xiàn)深拷貝時(shí),子類如何實(shí)現(xiàn)深度拷貝。 1.1 深拷貝同淺拷貝...
    iYeso閱讀 1,972評(píng)論 0 13
  • *面試心聲:其實(shí)這些題本人都沒(méi)怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個(gè)offer,總結(jié)起來(lái)就是把...
    Dove_iOS閱讀 27,619評(píng)論 30 472
  • 今天聽(tīng)了宇彤老師的課,感覺(jué)受益良多。因?yàn)槁曇籼刭|(zhì)的原因,高冷方面的問(wèn)題不是很嚴(yán)重,但今晚教授的練習(xí)方法還是可以讓我...
    靜墨琴書(shū)閱讀 702評(píng)論 0 0

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