2018iOS面試考卷你會嗎?

面試只是對個人技術(shù)及應(yīng)變能力的一次考驗。只有解決了一個問題,你才有機會遇見下一個問題。以下面試題由群友提供或網(wǎng)上收集整理,共勉。

一、選擇題

初級

1、下列哪個名詞是不屬于在UML類圖的(D)

A、 類名 B、屬性 ?C、操作 ?D、默認值

2、下列哪個關(guān)系描述的是聚合關(guān)系(B)

A、嘴巴 -- 頭 ? ? ? ? ? ?B 、汽車 -- 引擎

C、大雁 – 翅膀 ? ? ? ? D、葉 -- 樹

3、在OC中類的接口聲明關(guān)鍵字為:(B)

A、@import ? ? ? ? ? ? ? ?B、@interface?

C、@implemention ? ? ? ? ? D、@protocol

4、經(jīng)過下列哪種操作后需要使用release方法(C)

A、delegate ? ? ? ? ? ? ? ?B、assign

C、retain D、dealloc

5、OC中,所有類的根類是:(A)

A、NSObject ? ? ? ? ? ? ? B、NSDate

C、NSCoding ? ? ? ? ? ? ? D、UIView

6、向Xcode控制臺輸出一個字符串應(yīng)該用:(A)

A、NSLog() ? ? ? ? ? ? ? ?B、system.out.print()

C、NSPrintf() ? ? ? ? ? ? ? D、scanf()

7、必須實現(xiàn)的協(xié)議方法使用:關(guān)鍵字聲明(C)

A、@property ? ? ? ? ? ? ? B、@interface

C、@required ? ? ? ? ? ? ? D、@protocol

8、OC中布爾(BOOL)類型的變量的值只有:(B)

A、1/0 ? ? ? ? ? ? ? ? ? B、YES/NO

C、true/false ? ? ? ? ? ? ? D、1/-1

9、在OC中,類中成員變量的可見度(訪問權(quán)限)不包括:(D)

A、@public ? ? ? ? ? ? ? ? ? ?B、@protected

C、@private ? ? ? ? ? ? ? ? ? ?D、@optional?

10、面向?qū)ο蟮奶匦圆话ǎ海―)

A、封裝 ? ? ? ? ? ? ? ? ? ? B、繼承

C、多態(tài) ? ? ? ? ? ? ? ? ? ? D、構(gòu)造

11、類何時調(diào)用dealloc方法:(D)

A、[property release]后 ? ? ? ? ?B、[instance release]后

C、[super dealloc]時 ? ? ? ? ? ?D、當(dāng)引用計數(shù)為0時.

12、簡單類型的成員在使用@property()時,括號中應(yīng)使用:(A)

A、assign ? ? ? B、copy ? ? ? ?C、retain ? ? ? ? D、auto

13、NSRange是什么數(shù)據(jù)類型:(C)

A、數(shù)組 ? ? ? ? ? ? ? ? ? ?B、字典

C、結(jié)構(gòu)體 ? ? ? ? ? ? ? ? ?D、指針

14、實例變量默認的訪問修飾符是:(C)

A、@public ? ? ? ? ? ? ? ? ?B、@private

C、@protected ? ? ? ? ? ? ? ?D、@package

15、關(guān)于協(xié)議描述不正確的是:(D)

A、協(xié)議分正式和非正式協(xié)議

B、在要求確認協(xié)議的類必須實現(xiàn)協(xié)議中的方法時,可以使用@required

C、一個協(xié)議可以被多個類確認

D、協(xié)議中聲明的方法,默認是@optional的

16、NSMutableDictionary字典中刪除對象可以使用下面那個方法:(D)

A、filteredArrayUsingPredicate: ? ? ? ? ? ? B、arrayByAddingObject:

C、initWithCapacity: ? ? ? ? ? ? ? ? ? ? D、setValue:forKey:

17、在Xcode中,需要編譯混合Objective-C和C++的源碼文件,需要將文件格式的后綴改為 (C)

A. ?.c ? ? B. ?.cpp ? ? ?C. ?.mm ? ? ? D. ?.m

18、下列哪項不屬于數(shù)據(jù)持久化?(C)

A. 屬性列表 ? ? ? ? ? ? ? ? ? B. Core Data

C. NSUserDefaults ? ? ? ? ? ? ? ?D. 歸檔和反歸檔

19、下面哪個類可以創(chuàng)建可變對象(C)

A.NSString ? ? ? ? ? ? ? ? ? ?B. NSArray

C. NSMutableDictionary ? ? ? ? ? D.NSSet

20、對于類和對象的概念,屬性對象的是:(C)

A、奧迪A6 ? ? ? ? ? ? ? ? ? B、保齡球

C、世界冠軍劉翔 D、西紅柿

21、下面哪個方法不屬于NSObject的內(nèi)省方法(A)

A、init ? ? ? ? ? ? ? ? ? ? ?B、iskindOfClass

C、responseToselector ? ? ? ? ? ?D、isMemberOfClass

22、一個良好的算法由下面的基本結(jié)構(gòu)組成,但不包括(D)

A、順序結(jié)構(gòu) ? ? ? ? ? ? ? ? B、選擇結(jié)構(gòu)

C、循環(huán)結(jié)構(gòu) ? ? ? ? ? ? ? ? D、跳轉(zhuǎn)結(jié)構(gòu)

23、下面哪個方法可以比較兩個字符串的異同(B)

A、if(str = str2) ? ? ? ? ? ? ? B、if([str1 isEqualToString:str2])

C、if(str1&&str2) ? ? ? ? ? ? D、if([str1 length] == [str2 length])

24、NSMutableDictionary *dic = [[NSMutableDictionary alloc ]

initWithObjectsAndKeys:@”1”,@”2”,@”2”,@”3”,@”4”,nil];

NSArray *arr = [[NSAarry alloc]initWithArray:[dic allKeys]];

NSString *str = [[NSString alloc]initWithFormat:[arr objectAtIndex:0],[arr objectAtIndex:1], [arr objectAtIndex:2]];NSLog(@”%@”,str);輸出結(jié)果是:(C)

A、123 ? ? B、234 ? ? ? C、2 ? ? ? ? D、3

25、下列哪個修飾符的對象被廢棄后悔被自動賦值為nil?(C)

? ?A、__strong ? ? ? ? ? ? ? B、__autoreleasing

? ?C、__weak ? ? ? ? ? ? ? ?D、__unsafe_unretained

26、在SVN版本庫瀏覽器中,使用(A)指令可以查看所選文件或目錄的日志?

A、show log ?B、Rename ?C、Blame ? D、Save as

27、下列不是屬性默認關(guān)鍵字的是(D)

A、readwrite ?B、assign ?C、atomic ?D、copy

28、NSString *name = [[NSString alloc]initWithString:@"張三"];NSLog(@"%d",[name retainCount]);上述代碼打印結(jié)果是:(A)

A、-1 ? ? ?B、0 ? ? ? ?C、1 ? ? ? ? ?D、2

29、現(xiàn)有如下集合,能準(zhǔn)確刪除“張三”的代碼是:NSMutableDictionary * peoples=[NSMutableDictionary dictionaryWithObjectsAndKeys:@"張三",@"001",@"lisa",@"002",@"唐sir",@"老大哥", nil];(A)

A、[peoples removeObjectForKey:@"001"];

B、[peoples removeObject:@"張三"];

C、[peoples removeObjectAtIndex:0];

D、[peoples removeAllObjects];

30、NSArray *array = [NSArray arrayWithObjects:@"one", @"two", @"three",nil];

NSLog(@"%@",[array objectAtIndex:1]);

NSLog(@"%@",[array objectAtIndex:3]);

控制臺中打印的最后一條信息會是:(D)

A、one ? ? ? ?B、two ? ? ? ? C、three ? ? ? D、崩潰信息

31、NSRange的成員變量有:(A)

A、location,length ? ? ? ? ? ? B、width,height

C、location,height ? ? ? ? ? ? D、length,width

32、關(guān)于NSSet描述正確的有:(B)

A、NSSet可以存放任何數(shù)據(jù)類型的數(shù)據(jù)

B、NSSet存放數(shù)據(jù)是無序的

C、NSSet可以通過下標(biāo)獲取數(shù)據(jù)

D、NSSet存放的數(shù)據(jù)是有序的

33、NSRange是什么數(shù)據(jù)類型:(C)

A、數(shù)組 ?B、字典 ? ? C、結(jié)構(gòu)體 ? ? D、指針

34、關(guān)于協(xié)議描述不正確的是:(D)

A、協(xié)議分正式和非正式協(xié)議

B、在要求確認協(xié)議的類必須實現(xiàn)協(xié)議中的方法時,可以使用@required

C、一個協(xié)議可以被多個類確認

D、協(xié)議中聲明的方法,默認是@optional的

35、以下對類的描述不正確的是:(C)

A、類的接口部分可以包含實例變量、屬性和方法

B、可以把聲明和實現(xiàn)都放到.h文件中

C、一對文件(Person.h Person.m)只能定義一個類//可以定義多個類

D、類比較抽象,對象比較具體

36、Objective-C 語言中類的實例變量如果只可以被本類和其子類訪問,需要下列哪個修飾符:(C)

A、@public ? ? ? B、@private ? ? C、@protected ? ? D、@friendly

37、int a = 10;NSNumber *b = [[NSNumber alloc] initWithInt:a];NSLog(@"%d", a+++b);這段代碼的輸出結(jié)果是什么:(D)

A、21

B、20

C、30

D、編譯錯誤

38、下列選項中不能正常為emp的name屬性賦值的代碼有:(B)

A、emp.name=@"李嘉誠";

B、emp->name=@"李開復(fù)";

C、[emp setValue:@"柳傳志" forKey:@"name"];

D、[emp setName:@"黃光裕"];

39、關(guān)于類與對象的說法正確的是(A)

A、一個文件中可以聲明多個類

B、方法需要傳遞多個參數(shù)時,參數(shù)用逗號隔開

C、不是每個對象都有引用計數(shù)

D、Objective-C可以有多繼承

中級

1、關(guān)于KVC的描述正確的是:(B)

A、KVC是指"Key-Value Observing"

B、是一種間接訪問對象的屬性的機制

C、只能訪問對象的屬性

D、當(dāng)對象的屬性值改變時,我們能收到一個通知

2、以下說法正確的是:(C)

A、求數(shù)組的內(nèi)容的個數(shù)用length方法

B、字典是根據(jù)其位置來索引數(shù)據(jù)的

C、協(xié)議中定義的方法默認不是必須實現(xiàn)的

D、一個文件中可以聲明多個類

3、下面說法錯誤的是(B)

A、GCD的開銷要比NSThread大?

B、可以在子線程中修改UI元素

C、NSOperationQueue是比NSthread更高層的封裝

D、GCD可以根據(jù)不同優(yōu)先級分配線程

4、下列哪個操作不會引起引用計數(shù)(retaincount)的變化是:(C)

A、NSString *str = [[NSString stringWithFormat:@"hello"];?

B、NSMutableData *data = [NSMutableData allocWithZone:data1];

C、int a=1;

D、NSArray *arr = [[NSArray alloc]initWithArray:arr1];

5、多線程中棧與堆是公有的還是私有的(C)

A.棧公有,堆私有 ? ? ? ? ? B.棧公有,堆公有

C.棧私有,堆公有 ? ? ? ? ? D.棧私有,堆私有

6、以下哪個算法不是對稱加密算法(D)

A.DES ? ? ? B.RC5 ? ? ? C.AES ? ? ? D.RSA

7、優(yōu)秀的程序設(shè)計,應(yīng)遵循下列哪個準(zhǔn)則?(B)

A. 高內(nèi)聚,高耦合 ? ? ? ? ? ? ?B. 高內(nèi)聚,低耦合

C. 低內(nèi)聚,高耦合 ? ? ? ? ? ? ?D. 低內(nèi)聚,低耦合

8、對于runloop的理解不正確的是(C)

A、每個線程都有其對應(yīng)的RunLoop

B、默認非主線程的RunLoop是沒有運行的

C、在一個單獨的線程中沒有必要去啟用RunLoop

D、可以將NSTimer添加到runLoop

9、下列選項不是MVVM模式特點的是(A)

A、高耦合 ?B、可重用性 C、可測試性 D、獨立開發(fā)

10、對于Objective-C中的方括號“[]”的作用,下列說法錯誤的是:(D)

A、用于通知某個對象該做什么

B、方括號內(nèi)第一項是對象,其余部分是你需要對象執(zhí)行的操作

C、在Objective-C中通知對象執(zhí)行某種操作,稱為發(fā)送消息.(也叫調(diào)用方法)

D、方括號中可以為空

11、下列關(guān)于環(huán)信的說法錯誤的是(D)

A、環(huán)信是一個第三方平臺,提供即時通信服務(wù)(IM)。

B、環(huán)信是在XMPP的基礎(chǔ)上進行二次開發(fā)。

C、環(huán)信在網(wǎng)絡(luò)上傳輸?shù)臄?shù)據(jù)也是XML

D、使用環(huán)信,需要自己搭建服務(wù)器

12、關(guān)于Socket,下列說法錯誤的是(A)

A、socket本身是一種協(xié)議,而不是接口

B、通過socket我們才能使用TCP/IP協(xié)議

C、TCP/IP協(xié)議是傳輸層協(xié)議,主要解決數(shù)據(jù)如何在網(wǎng)絡(luò)中傳輸

D、socket是對TCP/IP協(xié)議的封裝

13、關(guān)于git和svn的說法正確的是(B)

A、在很多其情況下,git的速率遠遠比SVN小

B、git是分布式管理,SVN是集中式管理

C、git用分支比較麻煩

D、git必須用網(wǎng)絡(luò)并且服務(wù)器開啟的情況下才可以使用

二、簡答

問題1:請說明一下UML類圖中組合與聚合的區(qū)別

答:聚合與組合都表示整體與部分的關(guān)系,只不過在聚合關(guān)系中,成員對象可以脫離整體對象獨立存在,而在組合關(guān)系中,成員對象與整體對象之間具有同生共死的關(guān)系,例如頭與嘴巴,如果頭沒了,那么嘴巴自然也不復(fù)存在。

問題2:OC有多繼承嗎?沒有的話可以用什么方法替代?

答:多繼承即一個子類可以有多個父類,它繼承了多個父類的特性。OC的類沒有多繼承,只支持單繼承,如果要實現(xiàn)多繼承的話,可以通過類別和協(xié)議的方式來實現(xiàn)。protocal可以實現(xiàn)多個接口,通過實現(xiàn)多個接口可以完成多繼承。Category一般使用分類,用Category去重寫類的方法,僅對Category有效,不會影響到其他類與原有類的關(guān)系。

問題3:如果在block里面修改外部變量的值,會報錯嗎?

答:在默認情況下,不允許block內(nèi)部修改外部變量的數(shù)值。因為拷貝之后它與原數(shù)值指向了不同的地址。若是能改變則會破壞代碼的可讀性。

問題4:下面是一段能正確運行的代碼。為啥將外部變量定義成mutableString就能在block內(nèi)部對其進行修改?

void demoBlock() {

? ? NSMutableString *strM = [NSMutableString stringWithString:@”張三”];

? void(^myBlock)() = ^{

[strM setString:@”lisa”];

};

? ? myBlock();

? ? NSLog(@”%@”,strM);

}

答案:在block中引用外部變量要拷貝一份到堆中。

這個時候拷貝到堆中的地址與在棧中的地址是一樣的。因此,它指向zhangsan。在使用setString方法之時,將指針指向的地址的值進行修改。

![](media/15200565364442/15200580079155.jpg)

問題5:簡述_block/weak修飾符的區(qū)別

答:_block在arc和mrc環(huán)境下都能用,可以修飾對象,也能修飾基本數(shù)據(jù)類型

_weak只能在arc環(huán)境下使用,只能修飾對象,不能修飾基本數(shù)據(jù)類型

_block對象可以在block中重新賦值,_weak不行。

問題6:請簡單說明在安裝cocoapods時,使用pod install命令安裝框架后的大致過程

答:

1)分析依賴:該步驟會分析Podfile,查看不同類庫之間的依賴情況。如果有多個類庫依賴于同一個類庫,但是依賴于不同的版本,那么cocoaPods會自動設(shè)置一個兼容的版本。

2)下載依賴:根據(jù)分析依賴的結(jié)果,下載指定版本的類庫到本地項目中。

3)生成Pods項目:創(chuàng)建一個Pods項目專門用來編譯和管理第三方框架,CocoaPods會將所需的框架,庫等內(nèi)容添加到項目中,并且進行相應(yīng)的配置。

4)整合Pods項目:將Pods和項目整合到一個工作空間中,并且設(shè)置文件鏈接

問題7:在開發(fā)中,如何去優(yōu)化tableview呢?

答:

行高一定要緩存: 行高方法其實被調(diào)用的次數(shù)非常多。通過緩存行高,可以減少大量計算自動布局的過程。

不要動態(tài)創(chuàng)建子視圖:當(dāng)cell顯示的時候,不要再去創(chuàng)建了。所有的自視圖都應(yīng)該預(yù)先創(chuàng)建,如果不需要顯示可以設(shè)置hidden。

所有的子視圖都必須制定背景顏色

所有的顏色都不要使用alpha:設(shè)置alpha會增加圖層的計算,對性能的消耗非常之大。

cell柵格化

柵格化的代碼如下:

-(instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier(NSString *)reuseIdentifier {

? ? self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];

? ? if(self){

? ? ? ? //柵格化

? ? ? ? self.layer.shouldRasterize = YES;

? ? ? ? // 柵格化必須指定分辨率,否則默認使用 *1 生成圖像

? ? ? ? self.layer.raterizationScale = [UIScreen mainScreen].scale;

? ? }

? ? return self;

}

異步繪制

self.layer.drawsAsynchronously = YES;

問題8:SDWebimage 在內(nèi)存方面存在很大的問題,如何解決動態(tài)圖片內(nèi)存不釋放的問題?

答:SDWebimage 在內(nèi)存方面存在很大的內(nèi)存問題,靜態(tài)的圖片也會出現(xiàn)拉伸問題,動態(tài)的gif圖內(nèi)存峰值更加的高,內(nèi)存釋放不會及時。

1、利用CADisplayLink開啟一個時鐘,每次觸發(fā)只加載一幀圖像!而之前的圖像立即釋放。

2、用加時鐘的方式來解決內(nèi)存過大的問題,會造成額外的開銷。可以將動態(tài)圖片加載換成YYAnimatedImageView。

問題9:逆向分析最常用的有三種方法是什么?

網(wǎng)絡(luò)分析

通過分析和篡改接口數(shù)據(jù),可以有效的破解通過接口數(shù)據(jù)來控制客戶端行為的app,常用的抓包工具有Tcpdump, WireShark, Charles等,windows平臺有fidller

靜態(tài)分析

通過砸殼、反匯編、classdump頭文件等技術(shù)來分析app行為,通過這種方式可以有效的分析出app實用的一些第三方庫,甚至分析出app的架構(gòu)等內(nèi)容,常用的工具有dumpdecrypted(砸殼)、hopper disassembler(反匯編)、class_dump(導(dǎo)頭文件)

動態(tài)分析

動態(tài)分析指的是通過分析app的運行時數(shù)據(jù),來定位注入點或者獲取關(guān)鍵數(shù)據(jù),常用的工具有cycript(運行時控制臺)、 lldb+debugserver(遠程斷點調(diào)試)、logify(追蹤)

問題10:怎樣防止反編譯?

本地數(shù)據(jù)加密

對NSUserDefaults,sqlite存儲文件數(shù)據(jù)加密,保護帳號和關(guān)鍵信息

URL編碼加密

對程序中出現(xiàn)的URL進行編碼加密,防止URL被靜態(tài)分析

網(wǎng)絡(luò)傳輸數(shù)據(jù)加密

對客戶端傳輸數(shù)據(jù)提供加密方案,有效防止通過網(wǎng)絡(luò)接口的攔截獲取數(shù)據(jù)

方法體,方法名高級混淆

對應(yīng)用程序的方法名和方法體進行混淆,保證源碼被逆向后無法解析代碼

程序結(jié)構(gòu)混排加密

對應(yīng)用程序邏輯結(jié)構(gòu)進行打亂混排,保證源碼可讀性降到最低

借助第三方APP加固,例如:網(wǎng)易云易盾

問題11:在MVC架構(gòu)中,如何解決controller層的臃腫問題?

答:將網(wǎng)絡(luò)請求抽象到單獨的類中

將界面的拼裝抽象到專門的類中

構(gòu)造 ViewModel?

這樣抽象之后,View 只接受 ViewModel,而 Controller 只需要傳遞 ViewModel 這么一行代碼。而另外構(gòu)造 ViewModel 的過程,我們就可以移動到另外的類中了。

專門構(gòu)造存儲類

三、大廠面試題(答案略)

1、 RunLoop 的基本概念,它是怎么休眠的?

2、runtime如何通過selector找到對應(yīng)的IMP地址?

3、YYAsyncLayer如何異步繪制?

4、你是如何組件化解耦的?

5、_objc_msgForward函數(shù)是做什么的?直接調(diào)用它將會發(fā)生什么?

6、用過 TableView 嗎,平時怎么解決 TableView 滑動卡頓問題的?

7、KVC機制是如何通過key找到value?

8、app內(nèi)存你是如何分析的?

9、使用了第三方庫, 有看它們是怎么實現(xiàn)的嗎?

10、什么是強連通量算法?

11、如何應(yīng)對APP版本升級,數(shù)據(jù)結(jié)構(gòu)隨之變化?

12、單例會有什么弊端?

13、如何關(guān)閉默認的KVO的默認實現(xiàn),簡述KVO的實現(xiàn)原理。

14、說說Swift和Objective-C的聯(lián)系。

如果你也是一名開發(fā)者歡迎加入小編的iOS學(xué)習(xí)交流群605315994。2018期待和你一起學(xué)習(xí)交流,共同進步成長。

我是曉媛,喜歡記得關(guān)注我哦!

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

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

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