2023年iOS程序員面試試題及答案_第1頁(yè)
2023年iOS程序員面試試題及答案_第2頁(yè)
2023年iOS程序員面試試題及答案_第3頁(yè)
2023年iOS程序員面試試題及答案_第4頁(yè)
2023年iOS程序員面試試題及答案_第5頁(yè)
已閱讀5頁(yè),還剩10頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

2023年iOS程序員面試真題及答案一、單項(xiàng)選擇題1、如果需要在手動(dòng)管理內(nèi)存分配和釋放的Xcode項(xiàng)目中引入和編譯用ARC風(fēng)格編寫(xiě)的文件,那么需要在文件的CompilerFlags上添加參數(shù)______。

A.-shared

B.-fno-objc-arc

C.-fobjc-arc

D.-dynamic

2、CFSocket使用的是哪種socket?______

A.BSDSocket

B.NSOperationsQueuesocket

C.TCP/IPsocket

D.CFSocket

3、在哪個(gè)類(lèi)中將允許同時(shí)使用一個(gè)或多個(gè)Block?______

A.NSBlock

B.NSConcurrentBlock

C.NSBlockOperation

D.NSConcurrency

4、給定Objective-C字符串:NSString*str=@"Testing123";表達(dá)式[strsubstring:5];的結(jié)果為_(kāi)_____。

A.Testin

B.Test

C.undefined

D.Testi

5、[Foonew]與[[Fooalloc]init]的區(qū)別是______。

A.new比alloc+init更快

B.new在Objective-C里不存在

C.new不會(huì)初始化一個(gè)對(duì)象

D.沒(méi)有區(qū)別,是一樣的

6、floatx與“零值”比較的if語(yǔ)句為_(kāi)_____。

A.if(x==0)

B.if(x<0.00001f)

C.if(fabs(x)<0.00001f)

D.if(x>-0.00001f)

7、函數(shù)的局部變量所需存儲(chǔ)空間是在______分配的。

A.進(jìn)程的數(shù)據(jù)段

B.進(jìn)程的棧上

C.進(jìn)程的堆上

D.以上都可以

二、不定項(xiàng)選擇題8、在UIViewController類(lèi)中與模態(tài)相關(guān)的方法有哪些?______

A.presentViewController:animated:completion

B.dismissViewControllerAnimated:completion

C.a(chǎn)ddChildViewController

D.removeFromParentViewController

9、Objective-C有哪幾種內(nèi)存管理方法?______

A.MRR(ManualRetainRelease)

B.MRC(ManualReferenceCounting)

C.ARC(AutomaticReferenceCounting)

D.GC(GarbageCollection)

10、在使用瀏覽器打開(kāi)一個(gè)網(wǎng)頁(yè)的過(guò)程中,瀏覽器會(huì)使用的網(wǎng)絡(luò)協(xié)議包括______。

A.DNS

B.TCP

C.HTTP

D.Telnet

11、下面屬于構(gòu)造散列函數(shù)的方法是______。

A.直接定址法

B.?dāng)?shù)字分析法

C.除留余數(shù)法

D.平方取中法

三、簡(jiǎn)答題12、NSString*obj=[[NSDataalloc]init];,在編譯時(shí)和運(yùn)行時(shí)分別是什么類(lèi)型的對(duì)象?

13、兩個(gè)App之間如何互調(diào)傳值?

14、static關(guān)鍵字的作用是什么?static全局變量與普通全局變量的區(qū)別是什么?static局部變量與普通變量的區(qū)別是什么?static函數(shù)與普通函數(shù)的區(qū)別是什么?

四、編程題15、給定一個(gè)字符串,判斷其是否是一個(gè)IP地址,例如“”是一個(gè)IP地址。

16、實(shí)現(xiàn)內(nèi)存復(fù)制函數(shù)memcpy。

答案:

一、單項(xiàng)選擇題

1、C[解析]

題目需求是MRC和ARC的混合工程,且這里是在非ARC工程中添加指定的ARC文件,具體方法是選中項(xiàng)目中的Targets,然后單擊展開(kāi)BuildPhases下的CompileSources項(xiàng),可以看到項(xiàng)目中的類(lèi)文件,雙擊指定的類(lèi)文件并在彈出的輸入框中輸入-fobjc-arc即可單獨(dú)開(kāi)啟該文件的ARC模式,另外輸入-fno-objc-arc指的是單獨(dú)關(guān)閉該文件的ARC模式。

所以,本題的答案為C。2、A[解析]

選項(xiàng)A中的BSDSocket,又稱伯克利套接字,是進(jìn)程間通信的編程接口,位于最底層,在Cocoa框架中位于OS層。一般開(kāi)發(fā)都是在CoreFoundation層以上進(jìn)行編程的,避免編程過(guò)于復(fù)雜。

選項(xiàng)B中的NSOperationsQueue是iOS多線程編程中的類(lèi),用于定義和添加操作隊(duì)列,而非網(wǎng)絡(luò)編程相關(guān)。

選項(xiàng)C中的TCP/IP是位于傳輸層的網(wǎng)絡(luò)通信協(xié)議,建立在socket之上。

選項(xiàng)DCFSocket是使用BSDSocket實(shí)現(xiàn)的一個(gè)通信通道,是一個(gè)網(wǎng)絡(luò)編程API,用于iOS網(wǎng)絡(luò)編程中,其中位于Cocoa框架CoreFoundation層的NSNetwork就是基于CFSocket的。使用CFSocket在iOS中進(jìn)行網(wǎng)絡(luò)編程時(shí),需要引用以下頭文件:

#import<CoreFoundation/CoreFoundation.h>

#include<svs/socket.h>

#include<netinet/in.h>

所以,本題的答案為A。3、C

4、D

5、D

6、C

7、B[解析]

本題考察的是C++內(nèi)存管理知識(shí)。

一個(gè)C/C++編譯的程序所占用的系統(tǒng)內(nèi)存一般分為:BBS段、數(shù)據(jù)段、代碼段、堆和棧。如下圖所示:

(1)符號(hào)啟始的區(qū)塊(BlockStartedbySymbol,BSS)段

BSS段通常指用來(lái)存放程序中未初始化的全局?jǐn)?shù)據(jù)和靜態(tài)數(shù)據(jù)的一塊內(nèi)存區(qū)域。BSS段屬于靜態(tài)內(nèi)存分配,程序結(jié)束后靜態(tài)變量資源由系統(tǒng)自動(dòng)釋放。

(2)數(shù)據(jù)段(DataSegment)

數(shù)據(jù)段通常指用來(lái)存放程序中已初始化的全局變量的一塊內(nèi)存區(qū)域。數(shù)據(jù)段也屬于靜態(tài)內(nèi)存分配。因此,BBS段與數(shù)據(jù)段都屬于靜態(tài)區(qū)(全局區(qū))。

(3)代碼段(CodeSegment/TextSegment)

代碼段有時(shí)候也叫文本段,通常指用來(lái)存放程序執(zhí)行代碼(包括類(lèi)成員函數(shù)和全局函數(shù)以及其他函數(shù)代碼)的一塊內(nèi)存區(qū)域,這部分區(qū)域的大小在程序運(yùn)行前就已經(jīng)確定,并且內(nèi)存區(qū)域通常是只讀,某些架構(gòu)也允許代碼段為可寫(xiě),即允許修改程序。在代碼段中,也有可能包含一些只讀的常數(shù)變量,例如字符串常量。這個(gè)段一般是可以被共享的,比如在Linux操作系統(tǒng)中打開(kāi)了兩個(gè)Vi來(lái)編輯文本,那么一般來(lái)說(shuō),這兩個(gè)Vi是共享一個(gè)代碼段的。

(4)堆(heap)

堆是用于存放進(jìn)程運(yùn)行中被動(dòng)態(tài)分配的內(nèi)存段,它的大小并不固定,可動(dòng)態(tài)擴(kuò)張或縮減。當(dāng)進(jìn)程調(diào)用malloc或new等函數(shù)分配內(nèi)存時(shí),新分配的內(nèi)存就被動(dòng)態(tài)添加到堆上(堆被擴(kuò)張),當(dāng)利用free或delete等函數(shù)釋放內(nèi)存時(shí),被釋放的內(nèi)存從堆中被刪除(堆被縮減)。堆一般由程序員分配釋放,如果程序員自己不釋放,在程序結(jié)束時(shí),該塊內(nèi)存空間可能會(huì)由操作系統(tǒng)回收。需要注意的是,它與數(shù)據(jù)結(jié)構(gòu)中的堆是兩回事,分配方式類(lèi)似于鏈表。

(5)棧(stack)

棧上存放的是用戶臨時(shí)創(chuàng)建的局部變量,一般包括函數(shù)括弧“{}”中定義的變量(但不包括static聲明的變量,static意味著在數(shù)據(jù)段中存放變量)。除此之外,在函數(shù)被調(diào)用時(shí),其參數(shù)也會(huì)被壓入發(fā)起調(diào)用的進(jìn)程棧中,并且等到調(diào)用結(jié)束后,函數(shù)的返回值也會(huì)被存放回棧中。棧由編譯器自動(dòng)分配釋放,存放函數(shù)的參數(shù)值、局部變量的值等。其操作方式類(lèi)似于數(shù)據(jù)結(jié)構(gòu)中的棧。棧內(nèi)存分配運(yùn)算內(nèi)置于處理器的指令集中,一般使用寄存器來(lái)存取,效率很高,但是分配的內(nèi)存容量有限。

通過(guò)上述描述可知,選項(xiàng)B正確。

所以,本題的答案為B。二、不定項(xiàng)選擇題

8、AB[解析]

本題考察的是對(duì)模態(tài)視圖方法的理解。

模態(tài)方法指視圖控制器利用模態(tài)跳轉(zhuǎn)到另一個(gè)視圖控制器的方法,可以帶有跳轉(zhuǎn)動(dòng)畫(huà)。iOS中UIViewController的兩個(gè)模態(tài)相關(guān)方法主要就有選項(xiàng)A和B中的這兩個(gè)。

所以,本題的答案為A、B。9、ABCD[解析]MRC指手動(dòng)內(nèi)存管理;ARC指自動(dòng)內(nèi)存管理;GC指垃圾回收,只存在于MacOX開(kāi)發(fā)平臺(tái)上;MRR是MRC的官方名字。

所以,本題的答案為A、B、C、D。10、ABC[解析]

本題考察的是計(jì)算機(jī)網(wǎng)絡(luò)與通信知識(shí)。

一般在打開(kāi)網(wǎng)頁(yè)的時(shí)候,需要在瀏覽器中輸入網(wǎng)址,所以,需要通過(guò)網(wǎng)址找到訪問(wèn)資源的IP地址,從而可以把請(qǐng)求發(fā)送到對(duì)應(yīng)的機(jī)器上,在這個(gè)過(guò)程中需要域名系統(tǒng)(DomainNameSystem,DNS),它是互聯(lián)網(wǎng)上作為域名和IP地址相互映射的一個(gè)分布式數(shù)據(jù)庫(kù),能夠使用戶更方便地訪問(wèn)互聯(lián)網(wǎng),而不用去記住能夠被機(jī)器直接讀取的IP數(shù)串。通過(guò)主機(jī)名,最終得到該主機(jī)名對(duì)應(yīng)的IP地址的過(guò)程叫作域名解析。HTTP是用于從Web服務(wù)器傳輸超文本到本地瀏覽器的傳輸協(xié)議。瀏覽器與服務(wù)器通過(guò)HTTP協(xié)議進(jìn)行交互。HTTP是應(yīng)用層協(xié)議,在傳輸層是通過(guò)TCP協(xié)議來(lái)傳輸HTTP請(qǐng)求的。telnet是Internet遠(yuǎn)程登錄服務(wù)的標(biāo)準(zhǔn)協(xié)議和主要方式。它為用戶提供了在本地計(jì)算機(jī)上完成遠(yuǎn)程主機(jī)工作的能力。一般使用方法為通過(guò)終端登錄到遠(yuǎn)處主機(jī),所以在瀏覽器打開(kāi)網(wǎng)頁(yè)的過(guò)程中用不到。

所以,本題的答案為A、B、C。11、ABCD[解析]

本題考察的是常用的哈希函數(shù)的知識(shí)。

常用的構(gòu)造哈希函數(shù)的方法有:直接定址法、數(shù)字分析法、平方取中法、折疊法、除留余數(shù)法和隨機(jī)數(shù)法。以下將分別對(duì)這幾種方法進(jìn)行介紹。

1)直接定址法:取關(guān)鍵字或關(guān)鍵字的某個(gè)線性函數(shù)值為哈希地址。例如:H(key)=a*key+b,其中,a和b為常數(shù)。

2)數(shù)字分析法:假設(shè)關(guān)鍵字是以r為基數(shù)(例如:以10為基的十進(jìn)制數(shù)),并且哈希表中可能出現(xiàn)的關(guān)鍵字都是事先知道的,則可取關(guān)鍵字的若干數(shù)位組成哈希地址。

3)平方取中法:取關(guān)鍵字平方后的中間幾位作為哈希地址。

4)折疊法:將關(guān)鍵字分割成位數(shù)相同的幾部分,然后取這幾部分的疊加和作為哈希地址。

5)除留余數(shù)法:取關(guān)鍵字被某個(gè)小于或等于哈希表長(zhǎng)m的數(shù)p除后所得的余數(shù)作為哈希地址。(f(key)=keymodp(p≤m),m為散列表長(zhǎng))

6)隨機(jī)數(shù)法:選擇一個(gè)隨機(jī)函數(shù),取關(guān)鍵字的隨機(jī)函數(shù)值作為它的哈希地址。

所以,本題的答案為A、B、C、D。三、簡(jiǎn)答題12、編譯時(shí)是NSString類(lèi)型對(duì)象,運(yùn)行時(shí)是NSData對(duì)象。

13、第一步,給兩個(gè)需要相互調(diào)用的App設(shè)置URLSchemes。

第二步,為了適配iOS9及以上系統(tǒng)需要在info.plist中注冊(cè)LSApplicationQueriesSchemes,并在其中指定需要打開(kāi)的App的URL。

第三步,使用-(void)openURL:(NSURL*)urloptions:

(NSDictionary*)optionscompletionHandler:(void(^__nullable)(BOOLsuccess))completion方法打開(kāi)你需要跳轉(zhuǎn)的App。

14、static關(guān)鍵字是C/C++語(yǔ)言中都存在的關(guān)鍵字,它具有以下特性:

1)static全局變量的作用域范圍是有限制的,即如果一個(gè)變量被聲明為靜態(tài)的,那么該變量可以被模塊內(nèi)所有函數(shù)訪問(wèn),但不能被模塊外其他函數(shù)訪問(wèn),它是一個(gè)本地的全局變量。而普通全局變量能被其他模塊訪問(wèn)。

2)在函數(shù)體內(nèi),靜態(tài)變量具有“記憶”功能,即一個(gè)被聲明為靜態(tài)的變量在這一函數(shù)調(diào)用結(jié)束后,它的值仍然被保存著,當(dāng)這個(gè)函數(shù)下一次被調(diào)用的時(shí)候,這個(gè)靜態(tài)變量的值仍然是上次調(diào)用后的結(jié)果(需要注意的是,函數(shù)中的靜態(tài)變量只初始化一次),而函數(shù)體內(nèi)的普通變量沒(méi)有記憶功能。示例代碼如下:

#include<stdio.h>

voidfun1(inti)

{

staticintvalue=i;

printf("%d",++value);

}

voidfun2(inti)

{

intvalue=i;

printf("%d

",++value);

}

intmain()

{

printf("fun1:");

fun1(0);

fun1(4);

fun1(7);

printf("\nfun2:");

fun2(0);

fun2(4);

fun2(7);

return0;

}

程序的運(yùn)行結(jié)果為:

fun1:1

2

3

fun2:1

5

8

分析:函數(shù)fun1中把value定義為靜態(tài)變量,它會(huì)在第一次調(diào)用的時(shí)候初始化為0,由于其具有記憶功能,只會(huì)被初始化一次。因此,在調(diào)用函數(shù)fun1(0)的時(shí)候,函數(shù)fun1內(nèi)部的value被初始化為0,語(yǔ)句printf("%d",++value);輸出結(jié)果為1;當(dāng)調(diào)用函數(shù)fun1(4)的時(shí)候,語(yǔ)句staticintvalue=i;不會(huì)再被執(zhí)行(只能初始化一次),此時(shí)value的值為1,打印語(yǔ)句printf("%d

",++value)的輸出結(jié)果為2。同理,第三次調(diào)用函數(shù)fun1(7)時(shí),輸出的結(jié)果為3。而對(duì)于普通變量而言,沒(méi)有記憶功能,每次被調(diào)用的時(shí)候都需要初始化。調(diào)用fun2函數(shù)的時(shí)候,value每次都會(huì)被初始化為傳入的參數(shù),因此每次輸出++value的值就是實(shí)參+1。

3)如果一個(gè)函數(shù)被聲明為靜態(tài)的,那么該函數(shù)與普通函數(shù)的作用域不同,靜態(tài)函數(shù)的作用域僅在本文件中,它只能被這一模塊內(nèi)的其他函數(shù)調(diào)用,不能被模塊外的其他函數(shù)調(diào)用。也就是說(shuō),這個(gè)函數(shù)被限制在聲明它的模塊的本地范圍內(nèi)使用。而普通函數(shù)可以被其他模塊使用。四、編程題15、根據(jù)IP地址的特點(diǎn),題目也就是判斷以點(diǎn)號(hào)分開(kāi)的4個(gè)數(shù)字是否在0~255之間,當(dāng)然也可以直接使用正則表達(dá)式來(lái)進(jìn)行匹配。簡(jiǎn)單的辦法:輸入一個(gè)字符串,Objective-C中字符串NSString有一個(gè)函數(shù)可以將字符串分隔開(kāi),這里以點(diǎn)號(hào)將字符串分成幾個(gè)數(shù)字的字符串,然后轉(zhuǎn)化成整型數(shù)字依次判斷即可。利用如下知識(shí)點(diǎn)可以輕易解決本問(wèn)題:

NSString*string=@"";

/*以"."分割字符串,得到的數(shù)組有"192","168","0"和"2"4個(gè)字符串元素*/

NSArray<NSString*>*substringArray=[stringcomponentsSeparatedByString:@"."];

/*字符串轉(zhuǎn)整型對(duì)象*/

NSIntegernum=[substringArray[0]integerValue];

16、memcpy函數(shù)的功能是從源src所指的內(nèi)存地址的起始位置開(kāi)始復(fù)制n個(gè)字節(jié)到目標(biāo)dest所指的內(nèi)存地址的起始位置中。

它的函數(shù)原型為void*memcpy(void*dest,constvoid*src,size_tn);

這個(gè)函數(shù)的參數(shù)與返回值的類(lèi)型都是void*,在實(shí)現(xiàn)的時(shí)候,需要把void*轉(zhuǎn)換成可操作的數(shù)據(jù)類(lèi)型來(lái)處理。下面首先給出一個(gè)簡(jiǎn)單的實(shí)現(xiàn)方式,示例代碼如下:

#include<iostream>

usingnamespacestd;

void*mymemcpy1(void*dst,constvoid*src,size_tnum)

{

if(dst==NULL||src==NULL)

returnNULL;

constchar*psrc=(char*)src;

char*pdst=(char*)dst;

while(num-->0)

*pdst++=*psrc++;

returndst;

}

intmain()

{

charsrc[]="abc";

char*dest=newchar[4];

dest=(char*)mymemcpy1(dest,src,4);

printf("%s\n",dest);

delete[]dest;

return0;

}

程序的運(yùn)行結(jié)果為:

Abc

以上這種實(shí)現(xiàn)方式顯然沒(méi)有考慮內(nèi)存重疊的問(wèn)題,如果源字符串src與目標(biāo)字符串dst有重疊,那么上述程序?qū)?huì)有意想不到的結(jié)果。例如,把main函數(shù)換成如下的寫(xiě)法:

intmain()

{

charsrc[]="abc";

char*dest=src+1;

dest=(char*)mymemcpy1(dest,src,4);

printf("%s\n",dest);

return0;

}

此時(shí),程序會(huì)有意想不到的結(jié)果。

如下圖所示:

在上圖中,源字符串src與目標(biāo)字符串dest存在重疊,當(dāng)復(fù)制第一個(gè)字符“a”的時(shí)候,源字符串src的第二個(gè)字符也被修改了(“b”被修改成了“a”),因此,當(dāng)復(fù)制第二個(gè)字符的時(shí)候已經(jīng)出錯(cuò)了(本來(lái)應(yīng)該復(fù)制的是字符“b”,但實(shí)際上復(fù)制了字符“a”)。更嚴(yán)重的問(wèn)題是,在復(fù)制第三個(gè)字符的時(shí)候把源字符串的結(jié)束符“\0”也給替換掉了,所以導(dǎo)致在復(fù)制第四個(gè)字符的時(shí)候,應(yīng)該是復(fù)制一個(gè)結(jié)束符“\0”,但實(shí)際上復(fù)制了一個(gè)字符“a”,這就導(dǎo)致復(fù)制后,dest字符是無(wú)法確定的,因?yàn)闊o(wú)法確定下一個(gè)字符“\0”出現(xiàn)的位置。

但是,在調(diào)用系統(tǒng)函數(shù)memcpy的時(shí)候,程序的輸出結(jié)果依然是abc,說(shuō)明上面這個(gè)程序還不完整,主要是沒(méi)有考慮內(nèi)存重疊的問(wèn)題。處理內(nèi)存重疊的主要思路為:

1)當(dāng)源內(nèi)存的首地址大于目標(biāo)內(nèi)存的首地址時(shí),從源內(nèi)存的首地址開(kāi)始復(fù)制。

2)當(dāng)源內(nèi)存的首地址小于目標(biāo)內(nèi)存的首地址時(shí),從源內(nèi)存的首地址加待復(fù)制字節(jié)的長(zhǎng)度的地址開(kāi)始逆序復(fù)制。

下面給出第二種情況的實(shí)現(xiàn)示意圖。

從圖中可以看出,在這種情況下,如果從字符串的結(jié)尾開(kāi)始倒著復(fù)制,那么就能得到正確的結(jié)果。實(shí)現(xiàn)代碼如下

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論