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

下載本文檔

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

文檔簡介

2023年iOS程序員面試真題及答案一、單項選擇題1、如果需要在手動管理內(nèi)存分配和釋放的Xcode項目中引入和編譯用ARC風格編寫的文件,那么需要在文件的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、在哪個類中將允許同時使用一個或多個Block?______

A.NSBlock

B.NSConcurrentBlock

C.NSBlockOperation

D.NSConcurrency

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

A.Testin

B.Test

C.undefined

D.Testi

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

A.new比alloc+init更快

B.new在Objective-C里不存在

C.new不會初始化一個對象

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

6、floatx與“零值”比較的if語句為______。

A.if(x==0)

B.if(x<0.00001f)

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

D.if(x>-0.00001f)

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

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

B.進程的棧上

C.進程的堆上

D.以上都可以

二、不定項選擇題8、在UIViewController類中與模態(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、在使用瀏覽器打開一個網(wǎng)頁的過程中,瀏覽器會使用的網(wǎng)絡(luò)協(xié)議包括______。

A.DNS

B.TCP

C.HTTP

D.Telnet

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

A.直接定址法

B.數(shù)字分析法

C.除留余數(shù)法

D.平方取中法

三、簡答題12、NSString*obj=[[NSDataalloc]init];,在編譯時和運行時分別是什么類型的對象?

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

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

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

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

答案:

一、單項選擇題

1、C[解析]

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

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

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

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

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

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

#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)存管理知識。

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

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

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

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

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

(3)代碼段(CodeSegment/TextSegment)

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

(4)堆(heap)

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

(5)棧(stack)

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

通過上述描述可知,選項B正確。

所以,本題的答案為B。二、不定項選擇題

8、AB[解析]

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

所以,本題的答案為A、B、C、D。三、簡答題12、編譯時是NSString類型對象,運行時是NSData對象。

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

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

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

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

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

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

2)在函數(shù)體內(nèi),靜態(tài)變量具有“記憶”功能,即一個被聲明為靜態(tài)的變量在這一函數(shù)調(diào)用結(jié)束后,它的值仍然被保存著,當這個函數(shù)下一次被調(diào)用的時候,這個靜態(tài)變量的值仍然是上次調(diào)用后的結(jié)果(需要注意的是,函數(shù)中的靜態(tài)變量只初始化一次),而函數(shù)體內(nè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;

}

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

fun1:1

2

3

fun2:1

5

8

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

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

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

NSString*string=@"";

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

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

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

NSIntegernum=[substringArray[0]integerValue];

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

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

這個函數(shù)的參數(shù)與返回值的類型都是void*,在實現(xiàn)的時候,需要把void*轉(zhuǎn)換成可操作的數(shù)據(jù)類型來處理。下面首先給出一個簡單的實現(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;

}

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

Abc

以上這種實現(xiàn)方式顯然沒有考慮內(nèi)存重疊的問題,如果源字符串src與目標字符串dst有重疊,那么上述程序?qū)幸庀氩坏降慕Y(jié)果。例如,把main函數(shù)換成如下的寫法:

intmain()

{

charsrc[]="abc";

char*dest=src+1;

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

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

return0;

}

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

如下圖所示:

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

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

1)當源內(nèi)存的首地址大于目標內(nèi)存的首地址時,從源內(nèi)存的首地址開始復(fù)制。

2)當源內(nèi)存的首地址小于目標內(nèi)存的首地址時,從源內(nèi)存的首地址加待復(fù)制字節(jié)的長度的地址開始逆序復(fù)制。

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

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

溫馨提示

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

評論

0/150

提交評論