iOS開(kāi)發(fā)者面試必備:10個(gè)Objective-C基礎(chǔ)面試題

2013-07-16 09:18:32來(lái)源:開(kāi)源中國(guó)作者:

蘋果的iOS系統(tǒng)越來(lái)越火了,蘋果這個(gè)金礦平臺(tái)也吸引了大量的iOS開(kāi)發(fā)者參與其中,這也促使越來(lái)越多的公司向iOS應(yīng)用開(kāi)發(fā)方向靠攏,因此市場(chǎng)上 對(duì)iOS開(kāi)發(fā)的人才需求自然也非常巨大。如果你準(zhǔn)備去面試一個(gè)iOS開(kāi)發(fā)崗位,那

蘋果的iOS系統(tǒng)越來(lái)越火了,蘋果這個(gè)金礦平臺(tái)也吸引了大量的iOS開(kāi)發(fā)者參與其中,這也促使越來(lái)越多的公司向iOS應(yīng)用開(kāi)發(fā)方向靠攏,因此市場(chǎng)上 對(duì)iOS開(kāi)發(fā)的人才需求自然也非常巨大。如果你準(zhǔn)備去面試一個(gè)iOS開(kāi)發(fā)崗位,那么本文也許可以幫助你提前準(zhǔn)備一些iOS面試題,這些面試題都是 Objective-C基礎(chǔ)面試題,一起來(lái)看看。

1、#import和#include的區(qū)別,@class代表什么?

@class一般用于頭文件中需要聲明該類的某個(gè)實(shí)例變量的時(shí)候用到,在m文件中還是需要使用#import

而#import比起#include的好處就是不會(huì)引起重復(fù)包含

2、談?wù)凮bject-C的內(nèi)存管理方式及過(guò)程?

1.當(dāng)你使用new,alloc和copy方法創(chuàng)建一個(gè)對(duì)象時(shí),該對(duì)象的保留計(jì)數(shù)器值為1.當(dāng)你不再使用該對(duì)象時(shí),你要負(fù)責(zé)向該對(duì)象發(fā)送一條release或autorelease消息.這樣,該對(duì)象將在使用壽命結(jié)束時(shí)被銷毀.

2.當(dāng)你通過(guò)任何其他方法獲得一個(gè)對(duì)象時(shí),則假設(shè)該對(duì)象的保留計(jì)數(shù)器值為1,而且已經(jīng)被設(shè)置為自動(dòng)釋放,你不需要執(zhí)行任何操作來(lái)確保該對(duì)象被清理.如果你打算在一段時(shí)間內(nèi)擁有該對(duì)象,則需要保留它并確保在操作完成時(shí)釋放它.

3.如果你保留了某個(gè)對(duì)象,你需要(最終)釋放或自動(dòng)釋放該對(duì)象.必須保持retain方法和release方法的使用次數(shù)相等.

3、Object-C有私有方法嗎?私有變量呢?

objective-c – 類里面的方法只有兩種, 靜態(tài)方法和實(shí)例方法. 這似乎就不是完整的面向?qū)ο罅?按照OO的原則就是一個(gè)對(duì)象只暴露有用的東西. 如果沒(méi)有了私有方法的話, 對(duì)于一些小范圍的代碼重用就不那么順手了. 在類里面聲名一個(gè)私有方法

@interface Controller : NSObject { NSString *something; }

+ (void)thisIsAStaticMethod;

– (void)thisIsAnInstanceMethod;

@end

@interface Controller (private) -

(void)thisIsAPrivateMethod;

@end

@private可以用來(lái)修飾私有變量

在Objective〤中,所有實(shí)例變量默認(rèn)都是私有的,所有實(shí)例方法默認(rèn)都是公有的

4、Object-C有多繼承嗎?沒(méi)有的話用什么代替?cocoa 中所有的類都是NSObject 的子類

多繼承在這里是用protocol 委托代理 來(lái)實(shí)現(xiàn)的

你不用去考慮繁瑣的多繼承 ,虛基類的概念.

ood的多態(tài)特性 在 obj-c 中通過(guò)委托來(lái)實(shí)現(xiàn).

5、內(nèi)存管理 Autorelease、retain、copy、assign的set方法和含義?

1,你初始化(alloc/init)的對(duì)象,你需要釋放(release)它。例如:

NSMutableArray aArray = [[NSArray alloc] init]; 后,需要 [aArray release];

2,你retain或copy的,你需要釋放它。例如:

[aArray retain] 后,需要 [aArray release];

3,被傳遞(assign)的對(duì)象,你需要斟酌的retain和release。例如:

obj2 = [[obj1 someMethod] autorelease];

對(duì)象2接收對(duì)象1的一個(gè)自動(dòng)釋放的值,或傳遞一個(gè)基本數(shù)據(jù)類型(NSInteger,NSString)時(shí):你或希望將對(duì)象2進(jìn)行retain,以防止它在被使用之前就被自動(dòng)釋放掉。但是在retain后,一定要在適當(dāng)?shù)臅r(shí)候進(jìn)行釋放。

關(guān)于索引計(jì)數(shù)(Reference Counting)的問(wèn)題

retain值 = 索引計(jì)數(shù)(Reference Counting)

NSArray對(duì)象會(huì)retain(retain值加一)任何數(shù)組中的對(duì)象。當(dāng)NSArray被卸載(dealloc)的時(shí)候,所有數(shù)組中的對(duì)象會(huì) 被 執(zhí)行一次釋放(retain值減一)。不僅僅是NSArray,任何收集類(Collection Classes)都執(zhí)行類似操作。例如 NSDictionary,甚至UINavigationController。

Alloc/init建立的對(duì)象,索引計(jì)數(shù)為1。無(wú)需將其再次retain。

[NSArray array]和[NSDate date]等“方法”建立一個(gè)索引計(jì)數(shù)為1的對(duì)象,但是也是一個(gè)自動(dòng)釋放對(duì)象。所以是本地臨時(shí)對(duì)象,那么無(wú)所謂了。如果是打算在全Class中使用的變量(iVar),則必須retain它。

缺省的類方法返回值都被執(zhí)行了“自動(dòng)釋放”方法。(*如上中的NSArray)

在類中的卸載方法“dealloc”中,release所有未被平衡的NS對(duì)象。(*所有未被autorelease,而retain值為1的)

6、淺拷貝和深拷貝區(qū)別是什么

簡(jiǎn)單的來(lái)說(shuō)就是,在有指針的情況下,淺拷貝只是增加了一個(gè)指針指向已經(jīng)存在的內(nèi)存,而深拷貝就是增加一個(gè)指針并且申請(qǐng)一個(gè)新的內(nèi)存,使這個(gè)增加的指針指向這個(gè)新的內(nèi)存,采用深拷貝的情況下,釋放內(nèi)存的時(shí)候就不會(huì)出現(xiàn)在淺拷貝時(shí)重復(fù)釋放同一內(nèi)存的錯(cuò)誤

7、C和obj-c 如何混用

1)obj-c的編譯器處理后綴為m的文件時(shí),可以識(shí)別obj-c和c的代碼,處理mm文件可以識(shí)別obj-c,c,c++代碼,但cpp文件必須只能用c/c++代碼,而且cpp文件include的頭文件中,也不能出現(xiàn)obj-c的代碼,因?yàn)閏pp只是cpp

2)在mm文件中混用cpp直接使用即可,所以obj-c混cpp不是問(wèn)題

3)在cpp中混用obj-c其實(shí)就是使用obj-c編寫的模塊是我們想要的。

如果模塊以類實(shí)現(xiàn),那么要按照cpp class的標(biāo)準(zhǔn)寫類的定義,頭文件中不能出現(xiàn)obj-c的東西,包括#import cocoa的。實(shí)現(xiàn)文件中,即類的實(shí)現(xiàn)代碼中可以使用obj-c的東西,可以import,只是后綴是mm。

如果模塊以函數(shù)實(shí)現(xiàn),那么頭文件要按c的格式聲明函數(shù),實(shí)現(xiàn)文件中,c++函數(shù)內(nèi)部可以用obj-c,但后綴還是mm或m。

總結(jié):只要cpp文件和cpp include的文件中不包含obj-c的東西就可以用了,cpp混用obj-c的關(guān)鍵是使用接口,而不能直接使用 實(shí)現(xiàn)代 碼,實(shí)際上cpp混用的是obj-c編譯后的o文件,這個(gè)東西其實(shí)是無(wú)差別的,所以可以用。obj-c的編譯器支持cpp

8、Objective-C中類別和類擴(kuò)展的區(qū)別。

答案:category和extensions的不同在于后者可以添加屬性。另外后者添加的方法是必須要實(shí)現(xiàn)的。

extensions可以認(rèn)為是一個(gè)私有的Category。

9、我們說(shuō)的Objective-C是動(dòng)態(tài)運(yùn)行時(shí)語(yǔ)言是什么意思?

答案:多態(tài)。 主要是將數(shù)據(jù)類型的確定由編譯時(shí),推遲到了運(yùn)行時(shí)。

這個(gè)問(wèn)題其實(shí)淺涉及到兩個(gè)概念,運(yùn)行時(shí)和多態(tài)。

簡(jiǎn)單來(lái)說(shuō),運(yùn)行時(shí)機(jī)制使我們直到運(yùn)行時(shí)才去決定一個(gè)對(duì)象的類別,以及調(diào)用該類別對(duì)象指定方法。

多態(tài):不同對(duì)象以自己的方式響應(yīng)相同的消息的能力叫做多態(tài)。意思就是假設(shè)生物類(life)都用有一個(gè)相同的方法-eat;

那人類屬于生物,豬也屬于生物,都繼承了life后,實(shí)現(xiàn)各自的eat,但是調(diào)用是我們只需調(diào)用各自的eat方法。

也就是不同的對(duì)象以自己的方式響應(yīng)了相同的消息(響應(yīng)了eat這個(gè)選擇器)。

因此也可以說(shuō),運(yùn)行時(shí)機(jī)制是多態(tài)的基礎(chǔ)?

10、Objective-C堆和棧的區(qū)別?

管理方式:對(duì)于棧來(lái)講,是由編譯器自動(dòng)管理,無(wú)需我們手工控制;對(duì)于堆來(lái)說(shuō),釋放工作由程序員控制,容易產(chǎn)生memory leak。

申請(qǐng)大。

棧:在Windows下,棧是向低地址擴(kuò)展的數(shù)據(jù)結(jié)構(gòu),是一塊連續(xù)的內(nèi)存的區(qū)域。這句話的意思是棧頂?shù)牡刂泛蜅5淖畲笕萘渴窍到y(tǒng)預(yù)先規(guī)定好的,在 WINDOWS下,棧的大小是2M(也有的說(shuō)是1M,總之是一個(gè)編譯時(shí)就確定的常數(shù)),如果申請(qǐng)的空間超過(guò)棧的剩余空間時(shí),將提示overflow。因 此,能從棧獲得的空間較小。

堆:堆是向高地址擴(kuò)展的數(shù)據(jù)結(jié)構(gòu),是不連續(xù)的內(nèi)存區(qū)域。這是由于系統(tǒng)是用鏈表來(lái)存儲(chǔ)的空閑內(nèi)存地址的,自然是不連續(xù)的,而鏈表的遍歷方向是由低地址向高地址。堆的大小受限于計(jì)算機(jī)系統(tǒng)中有效的虛擬內(nèi)存。由此可見(jiàn),堆獲得的空間比較靈活,也比較大。

碎片問(wèn)題:對(duì)于堆來(lái)講,頻繁的new/delete勢(shì)必會(huì)造成內(nèi)存空間的不連續(xù),從而造成大量的碎片,使程序效率降低。對(duì)于棧來(lái)講,則不會(huì)存在這個(gè)問(wèn)題,因?yàn)闂J窍冗M(jìn)后出的隊(duì)列,他們是如此的一一對(duì)應(yīng),以至于永遠(yuǎn)都不可能有一個(gè)內(nèi)存塊從棧中間彈出

分配方式:堆都是動(dòng)態(tài)分配的,沒(méi)有靜態(tài)分配的堆。棧有2種分配方式:靜態(tài)分配和動(dòng)態(tài)分配。靜態(tài)分配是編譯器完成的,比如局部變量的分配。動(dòng)態(tài)分配由alloca函數(shù)進(jìn)行分配,但是棧的動(dòng)態(tài)分配和堆是不同的,他的動(dòng)態(tài)分配是由編譯器進(jìn)行釋放,無(wú)需我們手工實(shí)現(xiàn)。

分配效率:棧是機(jī)器系統(tǒng)提供的數(shù)據(jù)結(jié)構(gòu),計(jì)算機(jī)會(huì)在底層對(duì)棧提供支持:分配專門的寄存器存放棧的地址,壓棧出棧都有專門的指令執(zhí)行,這就決定了棧的效率比較高。堆則是C/C++函數(shù)庫(kù)提供的,它的機(jī)制是很復(fù)雜的。

以上就是10個(gè)面試者經(jīng)常會(huì)碰到的Objective-C基礎(chǔ)面試題,如果你正好要去應(yīng)聘iOS崗位那么請(qǐng)回到文章開(kāi)始重新認(rèn)真閱讀吧。iOS開(kāi)發(fā)還是相對(duì)比較有前途的,大家覺(jué)得呢?

關(guān)鍵詞:iOSObjective-C

贊助商鏈接: