iOS面試題收集整理(基礎(chǔ)篇)


前言


前幾個(gè)月一直在面試,收集一些網(wǎng)上的面試題,整理抄寫,做面試準(zhǔn)備,分享給大家.希望大家能夠面試成功!


分別寫出MRC環(huán)境下在assign、retain、copy下屬性name對(duì)應(yīng)的setter方法的內(nèi)部實(shí)現(xiàn).

//assign環(huán)境下
-(void)setName:(NSString *)name{

    _name = name;
}
//retain環(huán)境下
-(void)setName:(NSString *)name{
    
    if (_name != name) {
        [_name release];
        _name = [name retain];
    }
}
//copy環(huán)境下
-(void)setName:(NSString *)name{

    if (_name != name) {
        [_name release];
        _name = [name copy];
    }
}


ARC環(huán)境下的delloc具體存在的意義在于什么地方?舉例說明具體的s會(huì)用場(chǎng)景.

其實(shí)在MRC環(huán)境中delloc存在的意義是為了釋放自己的實(shí)例變量,移除觀察者,代理置空,停止timer等,但是在ARC環(huán)境下,系統(tǒng)已經(jīng)幫助釋放了該對(duì)象所包含的實(shí)例對(duì)象.當(dāng)然了像一些Core Foundation對(duì)象還是需要自己進(jìn)行手動(dòng)釋放的.那么delloc在ARC環(huán)境下的具體作用就是移除觀察者,代理置空,停止timer.


如何看待iOS中的拷貝?

在我看來,我們?nèi)粘OS開發(fā)過程中的拷貝一共有兩種,一種是深拷貝,另外一種則是淺拷貝.

(1)淺拷貝:淺拷貝實(shí)際上就是只拷貝指向?qū)ο蟮闹羔?并不會(huì)拷貝對(duì)象本身,也就是說淺拷貝和原來的指針是指向同一塊內(nèi)存地址的.
(2)深拷貝:深拷貝拷貝的則是對(duì)象的本身,所以拷貝前后的兩個(gè)指針只想的內(nèi)存地址是不一樣的.

</br>

系統(tǒng)都有哪些單例類?在實(shí)際開發(fā)過程中,單例的應(yīng)用場(chǎng)景在于什么地方?

答:系統(tǒng)為我們提供了很多單例類,比如NSUserDefaults、UIApplication、UIScreen、UIDevice、NSNotificationCenter、NSFileManager等等.而且在實(shí)際開發(fā)過程中,除了使用系統(tǒng)給我們提供的單例類之外,還會(huì)根據(jù)需求自己創(chuàng)建類.

例如,
1.數(shù)據(jù)庫處理.對(duì)于數(shù)據(jù)的增刪改查,可能在很多界面都會(huì)用到,那這個(gè)時(shí)候,我們可以定義一個(gè)針對(duì)數(shù)據(jù)處理的單例類.
2.音樂播放.在音樂播放類項(xiàng)目,一般在多個(gè)頁面都需要音樂播放,所有,我們可以寫一個(gè)音樂播放的單例類.
3.下載管理,當(dāng)下載音樂或者視頻的時(shí)候,我們應(yīng)該創(chuàng)建一個(gè)單例類來管理下載任務(wù).
4.登錄注冊(cè)類,當(dāng)一個(gè)應(yīng)用有登錄注冊(cè)的時(shí)候,我們應(yīng)給創(chuàng)建一個(gè)單例類來管理登錄者的用戶信息和登錄狀態(tài).


程序在啟動(dòng)的時(shí)候主要做了什么操作?

應(yīng)用程序在啟動(dòng)的時(shí)候,會(huì)首先執(zhí)行main函數(shù),而在main函數(shù)當(dāng)中會(huì)執(zhí)行UIApplicationMain函數(shù),UIApplicationMain函數(shù)主要做了如下的三個(gè)事情.

1.創(chuàng)建并且初始化一個(gè)UIApplication對(duì)象.
2.創(chuàng)建應(yīng)用程序代理對(duì)象,系統(tǒng)默認(rèn)的是AppDelegate.
3.創(chuàng)建一個(gè)事件循環(huán)RunLoop,用來實(shí)時(shí)監(jiān)測(cè)應(yīng)用的各種事件(觸摸,晃動(dòng),通知,觀察者,timer等)


簡述ViewController的幾個(gè)生命周期.

1.-(instancetype)init : 初始化方法
2.-(void)loadView : 加載根式圖
3.-(void)viewDidLoad : 根式圖已經(jīng)加載完成.
4.-(void)viewWillAppear : 視圖將要出現(xiàn).
5.-(void)viewDidAppear :視圖已經(jīng)出現(xiàn).
6.-(void)viewWillDisappear :視圖將要消失.
7.-(void)viewDidDisappear:視圖已經(jīng)消失.
8.-(void)delloc :釋放觀察者,timer關(guān)閉,代理置空.


UIImage初始化一個(gè)圖片的方法以及優(yōu)缺點(diǎn).

UIImage初始化一張圖片最常用的一共有三個(gè)方法,分別是是imageNamed:、imageWithContentesOfFile:、imageWithData:.

(1)imageNamed: : 這個(gè)方法創(chuàng)建的時(shí)所需要的圖片是從緩存中獲取的,先在緩存中查找是否有該圖片,如果沒有,那么會(huì)將圖片加進(jìn)緩存中再使用,如果有這張圖片,那么直接使用緩存中的,這個(gè)方法創(chuàng)建UIImage對(duì)象主要是用于圖片重復(fù)率比較高,當(dāng)然了,這個(gè)方法也是有弊端的,那就是一旦將圖片加入緩存當(dāng)中,這張圖片就不會(huì)被釋放掉了.

(2)imageWithContentesOfFile: :這個(gè)方法是直接從本地沙盒中獲取, 并不會(huì)結(jié)果緩存,主要是用于重復(fù)率不是很高的圖片,使用這種方式.

(3)imageWithData: : 這種方式可以使用本地的網(wǎng)絡(luò)數(shù)據(jù)也可以使用本地的二進(jìn)制數(shù)據(jù).但是這種方式會(huì)造成線程卡頓,所以建議放在子線程中進(jìn)行實(shí)現(xiàn).


block在定義成屬性應(yīng)該用什么關(guān)鍵字?為什么?

block在定義成屬性的時(shí)候應(yīng)該使用copy修飾,平常我們使用的block主要是存放在棧區(qū)的(有的也會(huì)存放在全局區(qū)).棧區(qū)的block出了作用域之后就會(huì)被釋放掉,如果我們?cè)赽lock釋放掉之后還繼續(xù)調(diào)用,那么就會(huì)出現(xiàn)crash.理論上,在全局區(qū)的block我們是不需要進(jìn)行copy的.但是大部分的block是存儲(chǔ)在棧區(qū)的,為了統(tǒng)一規(guī)范管理,所以我們都使用copy對(duì)block屬性進(jìn)行修飾.


談?wù)勀銓?duì)block和delegate的認(rèn)識(shí).

無論使用block還是delegate本質(zhì)上都是回調(diào).使用block,其優(yōu)勢(shì)是回調(diào)的block代碼塊直接放在block賦值位置,使代碼更加緊湊,但是使用block需要注意循環(huán)引用問題,需要使用__weak__block兩個(gè)修飾符來解決循環(huán)引用問題;delegate不能像block做特殊處理,但是如果多個(gè)對(duì)象設(shè)置的代理為一個(gè)對(duì)象,那么就需要在delegate中判斷一下到底是哪一個(gè)對(duì)象了.


什么是沙盒?

所謂沙盒就是操作系統(tǒng)為應(yīng)用程序分配的一個(gè)文件夾.應(yīng)用程序擁有這個(gè)文件夾的訪問權(quán)限,且只能對(duì)這個(gè)文件夾內(nèi)的文件進(jìn)行操作.(當(dāng)然也能訪問系統(tǒng)提供的文件夾,比如相冊(cè)),對(duì)其他應(yīng)用程序文件夾沒有訪問權(quán)限.


定義屬性的時(shí)候,什么情況使用copy、assign和retain?

assign用于簡單數(shù)據(jù)類型,如NSInteger、Bool、double等.copy和retain用于對(duì)象類型,不過copy是用于一個(gè)對(duì)象可能被修改,但是不想修改原件,所以拷貝一份出來(新拷貝的對(duì)象引用計(jì)數(shù)為1);這樣新拷貝的修改了,原件不會(huì)被修改,同樣,原件被修改了,新拷貝的不會(huì)被修改.retain則是引用計(jì)數(shù)加1,對(duì)象只有一個(gè),并不會(huì)進(jìn)行復(fù)制拷貝.


簡述應(yīng)用程序按Home鍵進(jìn)入后臺(tái)時(shí)的生命周期,以及從后臺(tái)進(jìn)入前臺(tái)的生命周期.

正在運(yùn)行的程序點(diǎn)擊Home鍵的時(shí)候,程序由活躍狀態(tài)變?yōu)榉腔钴S狀態(tài).之后程序就進(jìn)入后臺(tái).在這個(gè)過程中執(zhí)行了兩個(gè)方法分別是applicationWillResigeActiveapplicationDidEnterBackground.
當(dāng)程序從后臺(tái)進(jìn)入前臺(tái)的時(shí)候,應(yīng)用程序由非活躍狀態(tài)變?yōu)榛钴S狀態(tài),這個(gè)期間也執(zhí)行了兩個(gè)方法分別為applicationWillEnterForegroundapplicationDidBecomeActive.


在使用一些系統(tǒng)的類例如UITableView時(shí),會(huì)發(fā)現(xiàn)其delegate屬性設(shè)置為assign而不是retain,這是為什么?

使用assign而不使用retain的原因在于避免產(chǎn)生循環(huán)引用問題,如果使用retain修飾delegate的話,那么當(dāng)通過set方式賦值的時(shí)候,引用計(jì)數(shù)會(huì)加1,這樣到最后會(huì)造成循環(huán)引用,而assign是直接賦值,并不會(huì)引起引用計(jì)數(shù)的增加,因此使用assign并不會(huì)造成內(nèi)存泄露.

</br>

當(dāng)手指點(diǎn)擊屏幕上的登錄按鈕,響應(yīng)者鏈的檢測(cè)過程是什么樣子的?

當(dāng)手指觸摸到屏幕上的登錄按鈕,首先runloop檢測(cè)到觸摸事件,將事件傳遞給UIApplication對(duì)象,UIApplication對(duì)象將事件傳遞給AppDelegate對(duì)象,AppDelegate對(duì)象將事件傳遞給window對(duì)象,之后就是rootViewController,接著就是view,之后檢測(cè)view上的子視圖,通過比對(duì)找到觸摸的Button.


沙盒中一共有幾個(gè)文件夾,請(qǐng)簡述它們的作用?

沙盒之中一共有三個(gè)文件夾,分別是Documents、Library和Tmp.

Documents : 蘋果建議將程序中建立的或程序中瀏覽的文件數(shù)據(jù)保存到該目錄下,ITunes備份和恢復(fù)時(shí)候包含此目錄.
Library : 程序中默認(rèn)設(shè)置或者是其他狀態(tài)信息.
Library/Caches :存放緩存文件,一般是下載的圖片或視頻,iTunes不會(huì)備份此目錄,此目錄不會(huì)再在程序退出時(shí)刪除.
Tmp : 臨時(shí)文件夾,應(yīng)用程序會(huì)在重啟的時(shí)候,刪除該文件夾下的所有內(nèi)容.


在OC中引入頭文件使用的關(guān)鍵字是哪一個(gè)?能在C語言文件中使用嗎?

#import是OC中引入頭文件所使用的關(guān)鍵字,在C語言中不能使用;#include是OC和C語言中能引入頭文件共同使用的關(guān)鍵字.


#import#include相比,好處是什么?

使用#import可以避免重復(fù)導(dǎo)入頭文件問題,而使用#include需要注意重復(fù)導(dǎo)入問題,因此在OC中都是使用#import來導(dǎo)入頭文件.


#import <>#import " "相比,區(qū)別是什么?

#import <>用于系統(tǒng)文件的引用,編譯器會(huì)在系統(tǒng)文件目錄查找文件.
#import " "用于自定義文件的引用,編譯器首先在用戶目錄下查找,接著是安裝目錄,最后是系統(tǒng)目錄.


@class的作用是什么?

@class的作用是告訴編譯器@class后面跟的是一個(gè)類名.只是告訴編譯器有這個(gè)類名,類中具體還有什么方法并沒有提及,也就說不會(huì)導(dǎo)入類中的內(nèi)容.經(jīng)常在頭文件中使用.


多線程的優(yōu)點(diǎn)和缺點(diǎn)分別是什么?

優(yōu)點(diǎn):1.將耗時(shí)較長的事件放在子線程中,防止主線程被卡死.2.可以發(fā)揮多核處理的能力,提高cpu的使用率.
缺點(diǎn):1.每開辟一個(gè)縣城就會(huì)造成一定的資源損耗.2.會(huì)造成代碼可讀性變差.3.如果出現(xiàn)多個(gè)線程訪問一個(gè)資源,會(huì)造成資源搶奪現(xiàn)象.


NSOperationQueue有一個(gè)屬性叫maxConcurrentCount即最大并發(fā)數(shù),這里的最大并發(fā)數(shù)是什么含義?

這里的最大并發(fā)數(shù)是指在隊(duì)列中同時(shí)執(zhí)行的任務(wù)的個(gè)數(shù).


iOS中數(shù)據(jù)持久化都有哪些方式,各有什么特點(diǎn).iOS平臺(tái)如何做數(shù)據(jù)持久化的,CoreData和sqlite有無必然的聯(lián)系?CoreData是一個(gè)關(guān)系型數(shù)據(jù)庫嗎?

在iOS中有四種數(shù)據(jù)持久化方式,分別是屬性列表、數(shù)據(jù)歸檔、sqlite3數(shù)據(jù)庫、CoreData.

CoreData數(shù)據(jù)庫可以使用圖形界面快速定義app的數(shù)據(jù)模型,同時(shí)在你的代碼中容易獲取到它.CoreData提供了基礎(chǔ)結(jié)構(gòu)去處理常用的功能.,例如保存,恢復(fù),撤銷和重做.允許你在app中創(chuàng)建新的任務(wù).在使用CoreData數(shù)據(jù)庫的時(shí)候,你不需要安裝額外的數(shù)據(jù)庫系統(tǒng),因?yàn)镃oreData使用內(nèi)置的sqlite數(shù)據(jù)庫.CoreData將你的模型層放入一組在內(nèi)存的數(shù)據(jù)對(duì)象中,CoreData會(huì)跟中這些對(duì)象的變化,同時(shí)需要作出相反的變化,例如用戶執(zhí)行撤銷命令.當(dāng)CoreData在你app數(shù)據(jù)的改變進(jìn)行保存的時(shí)候,CoreData會(huì)把這些數(shù)據(jù)歸檔,并永久性保存.

CoreData不是一個(gè)關(guān)系型數(shù)據(jù)庫,雖然CoreData執(zhí)行SQLite作為一種存儲(chǔ)類型,但它不能使用任意SQLite數(shù)據(jù)庫.CoreData在使用過程中自己創(chuàng)建這個(gè)數(shù)據(jù)庫.CoreData支持一對(duì)一、一對(duì)多的關(guān)系.


什么是懶加載?在使用懶加載的時(shí)候應(yīng)該注意什么?

所謂的懶加載指的是延時(shí)創(chuàng)建對(duì)象.只有在需要的時(shí)候才去創(chuàng)建對(duì)象,在真正開發(fā)過程當(dāng)中,懶加載其實(shí)是重寫了getter方法,在getter方法中,實(shí)現(xiàn)對(duì)象的創(chuàng)建.如果對(duì)象為nil的時(shí)候才會(huì)創(chuàng)建,如果不為nil,直接返回對(duì)象.在真正使用懶加載的時(shí)候需要使用self.進(jìn)行調(diào)用,這樣才能調(diào)用屬性的getter方法.


什么叫RunTime.

Runtime就是運(yùn)行時(shí),一個(gè)程序開發(fā)過程當(dāng)中通常分為以下幾個(gè)階段,編輯-預(yù)編譯-編譯-連接-運(yùn)行,RunTime就是我們程序在運(yùn)行階段發(fā)生的一些事情,在這一個(gè)階段通常會(huì)把OC代碼轉(zhuǎn)化為C代碼,從而提高運(yùn)行效率.系統(tǒng)給我們提供了runtime的類庫,我們可以通過里面的方法實(shí)現(xiàn)OC方法到C函數(shù)的轉(zhuǎn)化,也可以給分類添加屬性.類庫中都有對(duì)應(yīng)的方法.


簡單描述一下RunLoop在實(shí)際開發(fā)過程中的場(chǎng)景.

比如一個(gè)頁面中同時(shí)輪播圖和tableView時(shí)候,在滑動(dòng)tableView的時(shí)候,輪播圖是不動(dòng)的.這時(shí)候我將輪播圖中的NSTimer加入RunLoop中.

再例如,在一個(gè)子線程中開啟另外的一個(gè)子線程現(xiàn)在圖片,卻發(fā)現(xiàn)下載任務(wù)并沒有執(zhí)行.這時(shí)候需要將下載圖片的任務(wù)代碼放入RunLoop中去.


簡單描述一下SDWebImage的原理和實(shí)現(xiàn)機(jī)制,以及SDWebImage的底層實(shí)現(xiàn)。

原理:
1、顯示占位圖。
2、在內(nèi)存緩存中查找圖片是否已經(jīng)下載,如果現(xiàn)在那么久回調(diào)顯示。
3、如果內(nèi)存緩存中沒有,生產(chǎn)NSInvocationOperation添加到隊(duì)列中去磁盤中查找,如果有那么久添加到內(nèi)存中并且回調(diào)顯示。
4、如果磁盤中沒有,那就使用下載器進(jìn)行下載,下載完成之后同時(shí)在你磁盤中和存緩存中保存并且回調(diào)顯示,寫到文件中也要單獨(dú)的使用NSInvocationOperation完成,避免拖慢主線程。
5、SDImageCache會(huì)在初始化的時(shí)候注冊(cè)一些消息通知,在內(nèi)存警告或者退到后臺(tái)的時(shí)候清理內(nèi)存圖片緩存,退出程序的時(shí)候回清理過期的圖片。

實(shí)現(xiàn)機(jī)制:代理模式

底層實(shí)現(xiàn)原理:沙河緩存機(jī)制,主要是由(內(nèi)存圖片緩存,內(nèi)存操作緩存,磁盤沙河緩存)


調(diào)用一個(gè)類的靜態(tài)方法需不需要release?

調(diào)用一個(gè)雷的靜態(tài)方法不需要ralease,其實(shí)靜態(tài)成員方法也是有對(duì)象的,叫做類對(duì)象。膽這個(gè)類對(duì)象在第一次訪問類成員的時(shí)候就會(huì)將其加載到內(nèi)存的,而且該類對(duì)象只在程序關(guān)閉的時(shí)候才會(huì)釋放,并不需要我們進(jìn)行管理。


簡述__weak和__block修飾符的區(qū)別。

1、__block修飾符不管是在ARC還是MRC環(huán)境下都可以使用,還可以修飾基本數(shù)據(jù)類型。
2、__weak只能在ARC環(huán)境下使用,也只能修飾對(duì)象,不能修飾基本數(shù)據(jù)。
3、被__block修飾的對(duì)象在block中可以重新被賦值,但是__weak不可以。


總結(jié)

這邊文章到這里就結(jié)束了,但是我的分享之路還沒有結(jié)束,歡迎繼續(xù)關(guān)注騷棟,謝謝.如果有問題可以探討~

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

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

  • 分別寫出MRC環(huán)境下在assign、retain、copy下屬性name對(duì)應(yīng)的setter方法的內(nèi)部實(shí)現(xiàn). //a...
    尼古拉斯帥德布耀德閱讀 219評(píng)論 0 0
  • *面試心聲:其實(shí)這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個(gè)offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,622評(píng)論 30 472
  • 1.OC的類可以多重繼承嗎?可以實(shí)現(xiàn)多個(gè)接口嗎?要想實(shí)現(xiàn)類似多重繼承如何實(shí)現(xiàn)?答:OC不可以實(shí)現(xiàn)多重繼承。可以實(shí)現(xiàn)...
    歐辰_OSR閱讀 2,157評(píng)論 0 30
  • 1. 父類實(shí)現(xiàn)深拷貝時(shí),子類如何實(shí)現(xiàn)深度拷貝。父類沒有實(shí)現(xiàn)深拷貝時(shí),子類如何實(shí)現(xiàn)深度拷貝。 1.1 深拷貝同淺拷貝...
    iYeso閱讀 1,972評(píng)論 0 13
  • OC的理解與特性O(shè)C作為一門面向?qū)ο蟮恼Z言,自然具有面向?qū)ο蟮恼Z言特性:封裝、繼承、多態(tài)。它既具有靜態(tài)語言的特性(...
    LIANMING_LI閱讀 580評(píng)論 0 0

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