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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

2023年iOS程序員面試真題及答案

一、單項選擇題

1、如果需要在手動管理內存分配和釋放的Xcode項目中引入和編譯

用ARC風格編寫的文件,那么需要在文件的CompilerFlags上添加

參數(shù)o

A.-sharedB.-fno-objc-arcC.-fobjc-arc

D.-dynamic

2、CFSocket使用的是哪種socket?

A.BSDSocket

B.NSOperationsQueuesocket

C.TCP/IPsocket

D.CFSocket

3、在哪個類中將允許同時使用一個或多個Block?

A.NSBlockB.NSConcurrentBlock

C.NSBlockOperationD.NSConcurrency

4、給定Objective-C字符串:NSString*str=@"Testing123";表

達式[strsubstring:5];的結果為。

A.TestinB.TestC.undefinedD.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.OOOOlf)

C.if(fabs(x)<0,OOOOlf)D.if(x>-0.OOOOlf)

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

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

C.進程的堆上D.以上都可以

二、不定項選擇題

8、在UlViewController類中與模態(tài)相關的方法有哪些?

A.presentViewController:animated:completion

B.dismissViewControllerAnimated:completion

C.addChi1dViewControIler

D.removeFromParentViewController

9、Objective-C有哪幾種內存管理方法?

A.MRR(ManualRetainRelease)

B.MRC(ManualReferenceCounting)

C.ARC(AutomaticReferenceCounting)

D.GC(GarbageCollection)

10、在使用瀏覽器打開一個網頁的過程中,瀏覽器會使用的網絡協(xié)

議包括O

A.DNSB.TCPC.HTTPD.Telnet

11、下面屬于構造散列函數(shù)的方法是o

A.直接定址法B.數(shù)字分析法

C.除留余數(shù)法D.平方取中法

三、簡答題

12、NSString*obj=[[NSDataalloc]init];,在編譯時和運行時分

別是什么類型的對象?

13、兩個App之間如何互調傳值?

14、static關鍵字的作用是什么?static全局變量與普通全局變量

的區(qū)別是什么?static局部變量與普通變量的區(qū)別是什么?static函

數(shù)與普通函數(shù)的區(qū)別是什么?

四、編程題

15、給定一個字符串,判斷其是否是一個IP地址,例如

“192.168.0.1”是一個IP地址。

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

答案:

一、單項選擇題

1、C

[解析]題目需求是MRC和ARC的混合工程,且這里是在非ARC工程

中添加指定的ARC文件,具體方法是選中項目中的Targets,然后

單擊展開BuildPhases下的CompileSources項,可以看到項目中

的類文件,雙擊指定的類文件并在彈出的輸入框中輸入-fobjc-arc

即可單獨開啟該文件的ARC模式,另外輸入-fno-objc-arc指的是

單獨關閉該文件的ARC模式。

□GeneralCapabiGtiesResourceTagsInfoBuHdS?t

PROJECT

?TargetDependencies(0items)

TARGETS

AS!r>gHiVi?w

▼CompileSourcM(8items)

SingieVieWTests

SingleViewUlTests

mVitwControlltr.mInSngleV

mNSString?Cltogory.m.inSirqeS”

mDog.m.鬲&ngi?Vle^

mCat.m.:nf>ng

mTtlt.m依SgiCV6

mPtrson?m_mSir時“4rw

roAnimaJ.mJHS;rgA

mAppDehrgite.mr-Sic;;

mmain.ms-^9cVicw

?UnkBinaryWithLibrartes(0itemt)

所以,本題的答案為Co

2、A

[解析]選項A中的BSDSocket,又稱伯克利套接字,是進程間

通信的編程接口,位于最底層,在Cocoa框架中位于OS層。一般開

發(fā)都是在CoreFoundation層以上進行編程的,避免編程過于復

雜。

選項B中的NSOperationsQueue是iOS多線程編程中的類,用

于定義和添加操作隊列,而非網絡編程相關。

選項C中的TCP/IP是位于傳輸層的網絡通信協(xié)議,建立在

socket之上。

選項DCFSocket是使用BSDSocket實現(xiàn)的一個通信通道,是

一個網絡編程API,用于iOS網絡編程中,其中位于Cocoa框架

CoreFoundation層的NSNetwork就是基于CFSocket的。使用

CFSocket在iOS中進行網絡編程時,需要引用以下頭文件:

#import<CoreFoundation/CoreFoundation.h>

#include<svs/socket.h>

#include<netinet/in.h>

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

7、B

[解析]本題考察的是C++內存管理知識。

一個C/C++編譯的程序所占用的系統(tǒng)內存一般分為:BBS段、數(shù)

據(jù)段、代碼段、堆和棧。如下圖所示:

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

段通常指用來存放程序中未初始化的全局數(shù)據(jù)和靜態(tài)數(shù)據(jù)的一塊內

存區(qū)域。BSS段屬于靜態(tài)內存分配,程序結束后靜態(tài)變量資源由系

統(tǒng)自動釋放。

(2)數(shù)據(jù)段(DataSegment)數(shù)據(jù)段通常指用來存放程序中已初

始化的全局變量的一塊內存區(qū)域。數(shù)據(jù)段也屬于靜態(tài)內存分配。因

此,BBS段與數(shù)據(jù)段都屬于靜態(tài)區(qū)(全局區(qū))。

(3)代碼段(CodeSegment/TextSegment)代碼段有時候也叫

文本段,通常指用來存放程序執(zhí)行代碼(包括類成員函數(shù)和全局函數(shù)

以及其他函數(shù)代碼)的一塊內存區(qū)域,這部分區(qū)域的大小在程序運行

前就已經確定,并且內存區(qū)域通常是只讀,某些架構也允許代碼段

為可寫,即允許修改程序。在代碼段中,也有可能包含一些只讀的

常數(shù)變量,例如字符串常量。這個段一般是可以被共享的,比如在

Linux操作系統(tǒng)中打開了兩個Vi來編輯文本,那么一般來說,這兩

個Vi是共享一個代碼段的。

(4)堆(heap)堆是用于存放進程運行中被動態(tài)分配的內存段,

它的大小并不固定,可動態(tài)擴張或縮減。當進程調用malloc或new

等函數(shù)分配內存時,新分配的內存就被動態(tài)添加到堆上(堆被擴

張),當利用free或delete等函數(shù)釋放內存時,被釋放的內存從堆

中被刪除(堆被縮減)。堆一般由程序員分配釋放,如果程序員自己

不釋放,在程序結束時,該塊內存空間可能會由操作系統(tǒng)回收。需

要注意的是,它與數(shù)據(jù)結構中的堆是兩回事,分配方式類似于鏈

表。

(5)棧(stack)棧上存放的是用戶臨時創(chuàng)建的局部變量,一般

包括函數(shù)括弧“{}”中定義的變量(但不包括static聲明的變量,

static意味著在數(shù)據(jù)段中存放變量)。除此之外,在函數(shù)被調用

時,其參數(shù)也會被壓人發(fā)起調用的進程棧中,并且等到調用結束

后,函數(shù)的返回值也會被存放回棧中。棧由編譯器自動分配釋放,

存放函數(shù)的參數(shù)值、局部變量的值等。其操作方式類似于數(shù)據(jù)結構

中的棧。棧內存分配運算內置于處理器的指令集中,一般使用寄存

器來存取,效率很高,但是分配的內存容量有限。

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

所以,本題的答案為Bo

二、不定項選擇題

8、AB

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

模態(tài)方法指視圖控制器利用模態(tài)跳轉到另一個視圖控制器的方

法,可以帶有跳轉動畫。iOS中UIViewControHer的兩個模態(tài)相關

方法主要就有選項A和B中的這兩個。

所以,本題的答案為A、Bo

9、ABCD

[解析]MRC指手動內存管理;ARC指自動內存管理;GC指垃圾回

收,只存在于MacOX開發(fā)平臺上;MRR是MRC的官方名字。

所以,本題的答案為A、B、C、Do

10、ABC

[解析]本題考察的是計算機網絡與通信知識。

一般在打開網頁的時候,需要在瀏覽器中輸入網址,所以,需

要通過網址找到訪問資源的IP地址,從而可以把請求發(fā)送到對應的

機器上,在這個過程中需要域名系統(tǒng)(DomainNameSystem,DNS),

它是互聯(lián)網上作為域名和IP地址相互映射的一個分布式數(shù)據(jù)庫,能

夠使用戶更方便地訪問互聯(lián)網,而不用去記住能夠被機器直接讀取

的IP數(shù)串。通過主機名,最終得到該主機名對應的IP地址的過程

叫作域名解析。HTTP是用于從Web服務器傳輸超文本到本地瀏覽器

的傳輸協(xié)議。瀏覽器與服務器通過HTTP協(xié)議進行交互。HTTP是應

用層協(xié)議,在傳輸層是通過TCP協(xié)議來傳輸HTTP請求的。telnet

是Internet遠程登錄服務的標準協(xié)議和主要方式。它為用戶提供了

在本地計算機上完成遠程主機工作的能力。一般使用方法為通過終

端登錄到遠處主機,所以在瀏覽器打開網頁的過程中用不到。

所以,本題的答案為A、B、Co

11、ABCD

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

常用的構造哈希函數(shù)的方法有:直接定址法、數(shù)字分析法、平

方取中法、折疊法、除留余數(shù)法和隨機數(shù)法。以下將分別對這幾種

方法進行介紹。

1)直接定址法:取關鍵字或關鍵字的某個線性函數(shù)值為哈希地

址。例如:H(key)=a*key+b,其中,a和b為常數(shù)。

2)數(shù)字分析法:假設關鍵字是以r為基數(shù)(例如:以10為基的

十進制數(shù)),并且哈希表中可能出現(xiàn)的關鍵字都是事先知道的,則可

取關鍵字的若干數(shù)位組成哈希地址。

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

4)折疊法:將關鍵字分割成位數(shù)相同的幾部分,然后取這幾部

分的疊加和作為哈希地址。

5)除留余數(shù)法:取關鍵字被某個小于或等于哈希表長m的數(shù)p

除后所得的余數(shù)作為哈希地址。(f(key)=keymodp(p<m),m為散

列表長)

6)隨機數(shù)法:選擇一個隨機函數(shù),取關鍵字的隨機函數(shù)值作為

它的哈希地址。

所以,本題的答案為A、B、C、Do

三、簡答題

12、編譯時是NSString類型對象,運行時是NSData對象。

13、第一步,給兩個需要相互調用的App設置URLSchemeSo

第二步,為了適配iOS9及以上系統(tǒng)需要在info,plist中注冊

LSApp1icationQueriesSchemes,并在其中指定需要打開的App的

URLo

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

(NSDictionary*)optionscompletionHandler:

(void—nullable)(BOOLsuccess))completion方法打開你需要

跳轉的App。14、static關鍵字是C/C++語言中都存在的關鍵

字,它具有以下特性:

Dstatic全局變量的作用域范圍是有限制的,即如果一個變量

被聲明為靜態(tài)的,那么該變量可以被模塊內所有函數(shù)訪問,但不能

被模塊外其他函數(shù)訪問,它是一個本地的全局變量。而普通全局變

量能被其他模塊訪問。

2)在函數(shù)體內,靜態(tài)變量具有“記憶”功能,即一個被聲明為

靜態(tài)的變量在這一函數(shù)調用結束后,它的值仍然被保存著,當這個

函數(shù)下一次被調用的時候,這個靜態(tài)變量的值仍然是上次調用后的

結果(需要注意的是,函數(shù)中的靜態(tài)變量只初始化一次),而函數(shù)體

內的普通變量沒有記憶功能。示例代碼如下:

#include<stdio.h>

voidfunl(inti)

{

staticintvalue=i;

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

}

voidfun2(inti)

{

intvalue=i;

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

}

intmain()

{

printfC'funl:,r);

funl(0);

funl(4);

funl⑺;

printf("\nfun2:");

fun2(0);

fun2(4);

fun2(7);

return0;

程序的運行結果為:

funl:123

fun2:158

分析:函數(shù)funl中把value定義為靜態(tài)變量,它會在第一次調

用的時候初始化為0,由于其具有記憶功能,只會被初始化一次。

因此,在調用函數(shù)funl(0)的時候,函數(shù)funl內部的value被初始

化為0,語句printf("%d",++value);輸出結果為1;當調用函數(shù)

funl(4)的時候,語句staticintvalue=i;不會再被執(zhí)行(只能初

始化一次),此時value的值為1,打印語句printf("%d

",++value)的輸出結果為2。同理,第三次調用函數(shù)funl(7)時,輸

出的結果為3。而對于普通變量而言,沒有記憶功能,每次被調用

的時候都需要初始化。調用fun2函數(shù)的時候,value每次都會被初

始化為傳入的參數(shù),因此每次輸出++value的值就是實參+1。

3)如果一個函數(shù)被聲明為靜態(tài)的,那么該函數(shù)與普通函數(shù)的作

用域不同,靜態(tài)函數(shù)的作用域僅在本文件中,它只能被這一模塊內

的其他函數(shù)調用,不能被模塊外的其他函數(shù)調用。也就是說,這個

函數(shù)被限制在聲明它的模塊的本地范圍內使用。而普通函數(shù)可以被

其他模塊使用。

四、編程題

15、根據(jù)IP地址的特點,題目也就是判斷以點號分開的4個數(shù)字是

否在0?255之間,當然也可以直接使用正則表達式來進行匹配。簡

單的辦法:輸入一個字符串,Objective-C中字符串NSString有一

個函數(shù)可以將字符串分隔開,這里以點號將字符串分成幾個數(shù)字的

字符串,然后轉化成整型數(shù)字依次判斷即可。利用如下知識點可以

輕易解決本問題:

NSString*string=@"192.168.0.2";

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

字符串元素*/

NSArray<NSString*>*substringArray=[string

componentsSeparatedByString:@'r."];

/*字符串轉整型對象*/

NSIntegernum=[substringArray[0]integerValue];16、

memcpy函數(shù)的功能是從源src所指的內存地址的起始位置開始復制

n個字節(jié)到目標dest所指的內存地址的起始位置中。

它的函數(shù)原型為void*memcpy(void*dest,const

void*src,size_tn);

這個函數(shù)的參數(shù)與返回值的類型都是void*,在實現(xiàn)的時候,

需要把void*轉換成可操作的數(shù)據(jù)類型來處理。下面首先給出一個

簡單的實現(xiàn)方式,示例代碼如下:

#include<iostrearn>

usingnamespacestd;

void*mymemcpyl(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[]=',abcn;

char*dest=newchar[4];

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

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

delete[]dest;

return0;

}

程序的運行結果為:

Abe

以上這種實現(xiàn)方式顯然沒有考慮內存重疊的問題,如果源字符

串src與目標字符串dst有重疊,那么上述程序將會有意想不到的

結果。例如,把main函數(shù)換成如下的寫法:

intmain()

{

charsrc[]="abc'r;

char*dest=src+l;

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

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

return0;

此時,程序會有意想不到的結果。

如下圖所示:

srcdest

復制前

豆制第一個字母

復制第三個字母

在上圖中,源字符串src與目標字符串dest存在重疊,當復制

第一個字符“a”的時候,源字符串src的第二個字符也被修改了

(“b”被修改成了“a”),因此,當復制第二個字符的時候已經出

錯了(本來應該復制的是字符“b”,但實際上復制了字符“a”)。

更嚴重的問題是,在復制第三個字符的時候把源字符串的結束符

“\0”也給替換掉了,所以導致在復制第四個字符的時候,應該是

復制一個結束符“\0”,但實際上復制了一個字符“a”,這就導致

復制后,dest字符是無法確定的,因為無法確定下一個字符“\0”

出現(xiàn)的位置。

但是,在調用系統(tǒng)函數(shù)memcpy的時候,程序的輸出結果依然是

abc,說明上面這個程序還不完整,主要是沒有考慮內存重疊的問

題。處理內存重疊的主要思路為:

1)當源內存的首地址大于目標內存的首地址時,從源內存的首

地址開始復制。

2)當源內存的首地址小于目標內存的首地址時,從源內存的首

地址加待復制字節(jié)的長度的地址開始逆序復制。

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

srcdest

復制前abc\0

溫馨提示

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

評論

0/150

提交評論