ios 面試基礎問題

來源:互聯網
上載者:User

標籤:

轉自http://www.jianshu.com/p/9c83145bb4baiOS面試字數2396 閱讀2097 評論4 喜歡93

1、#import和#include的區別,@class代表什嗎?

@class一般用於標頭檔中需要聲明該類的某個執行個體變數的時候用到,在m檔案中還是需要使用#import

而#import比起#include的好處就是不會引起重複包含

2、談談Object-C的記憶體管理方式及過程?

1.當你使用new,alloc和copy方法建立一個對象時,該對象的保留計數器值為1.當你不再使用該對象時,你要負責向該對象發送一條release或autorelease訊息.這樣,該對象將在使用壽命結束時被銷毀.

2.當你通過任何其他方法獲得一個對象時,則假設該對象的保留計數器值為1,而且已經被設定為自動釋放,你不需要執行任何操作來確保該對象被清理.如果你打算在一段時間內擁有該對象,則需要保留它並確保在操作完成時釋放它.

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

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

objective-c – 類裡面的方法只有兩種, 靜態方法和執行個體方法. 這似乎就不是完整的物件導向了,按照OO的原則就是一個對象只暴露有用的東西. 如果沒有了私人方法的話, 對於一些小範圍的代碼重用就不那麼順手了. 在類裡面聲名一個私人方法

    @interface Controller : NSObject { NSString *something; }

   + (void)thisIsAStaticMethod;

   – (void)thisIsAnInstanceMethod;

   @end

@interface Controller (private) -

(void)thisIsAPrivateMethod;

@end

@private可以用來修飾私人變數

在Objective‐C中,所有執行個體變數預設都是私人的,所有執行個體方法預設都是公有的

4、Object-C有多繼承嗎?沒有的話用什麼代替?cocoa 中所有的類都是NSObject 的子類

多繼承在這裡是用protocol 委託代理 來實現的

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

ood的多態特性 在 obj-c 中通過委託來實現.

5、記憶體管理 Autorelease、retain、copy、assign的set方法和含義?

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

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

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

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

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

obj2 = [[obj1 someMethod] autorelease];

對象2接收對象1的一個自動釋放的值,或傳遞一個基礎資料型別 (Elementary Data Type)(NSInteger,NSString)時:你或希望將對象2進行retain,以防止它在被使用之前就被自動釋放掉。但是在retain後,一定要在適當的時候進行釋放。

關於索引計數(Reference Counting)的問題

retain值 = 索引計數(Reference Counting)

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

Alloc/init建立的對象,索引計數為1。無需將其再次retain。

[NSArray array]和[NSDate date]等“方法”建立一個索引計數為1的對象,但是也是一個自動釋放對象。所以是本地臨時對象,那麼無所謂了。如果是打算在全Class中使用的變數(iVar),則必須retain它。

預設的類方法傳回值都被執行了“自動釋放”方法。(*如上中的NSArray)

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

6、淺拷貝和深拷貝區別是什麼

簡單的來說就是,在有指標的情況下,淺拷貝只是增加了一個指標指向已經存在的記憶體,而深拷貝就是增加一個指標並且申請一個新的記憶體,使這個增加的指標指向這個新的記憶體,採用深拷貝的情況下,釋放記憶體的時候就不會出現在淺拷貝時重複釋放同一記憶體的錯誤

7、C和obj-c 如何混用

1)obj-c的編譯器處理尾碼為m的檔案時,可以識別obj-c和c的代碼,處理mm檔案可以識別obj-c,c,c++代碼,但cpp檔案必須只能用c/c++代碼,而且cpp檔案include的標頭檔中,也不能出現obj-c的代碼,因為cpp只是cpp

2)在mm檔案中混用cpp直接使用即可,所以obj-c混cpp不是問題

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

如果模組以類實現,那麼要按照cpp class的標準寫類的定義,標頭檔中不能出現obj-c的東西,包括#import cocoa的。實現檔案中,即類的實現代碼中可以使用obj-c的東西,可以import,只是尾碼是mm。

如果模組以函數實現,那麼標頭檔要按c的格式聲明函數,實現檔案中,c++函數內部可以用obj-c,但尾碼還是mm或m。

總結:只要cpp檔案和cpp include的檔案中不包含obj-c的東西就可以用了,cpp混用obj-c的關鍵是使用介面,而不能直接使用 實現代 碼,實際上cpp混用的是obj-c編譯後的o檔案,這個東西其實是無差別的,所以可以用。obj-c的編譯器支援cpp

8、Objective-C中類別和類擴充的區別。

答案:category和extensions的不同在於後者可以添加屬性。另外後者添加的方法是必須要實現的。

extensions可以認為是一個私人的Category。

9、我們說的Objective-C是動態運行時語言是什麼意思?

答案:多態。 主要是將資料類型的確定由編譯時間,延遲到了運行時。

這個問題其實淺涉及到兩個概念,運行時和多態。

簡單來說,運行時機制使我們直到運行時才去決定一個對象的類別,以及調用該類別對象指定方法。

多態:不同對象以自己的方式響應相同的訊息的能力叫做多態。意思就是假設生物類(life)都用有一個相同的方法-eat;

那人類屬於生物,豬也屬於生物,都繼承了life後,實現各自的eat,但是調用是我們只需調用各自的eat方法。

也就是不同的對象以自己的方式響應了相同的訊息(響應了eat這個選取器)。

因此也可以說,運行時機制是多態的基礎?

10、Objective-C堆和棧的區別?

管理方式:對於棧來講,是由編譯器自動管理,無需我們手工控制;對於堆來說,釋放工作由程式員控制,容易產生memory leak。

申請大小:

棧:在Windows下,棧是向低地址擴充的資料結構,是一塊連續的記憶體的地區。這句話的意思是棧頂的地址和棧的最大容量是系統預先規定好的,在 WINDOWS下,棧的大小是2M(也有的說是1M,總之是一個編譯時間就確定的常數),如果申請的空間超過棧的剩餘空間時,將提示overflow。因 此,能從棧獲得的空間較小。

堆:堆是向高地址擴充的資料結構,是不連續的記憶體地區。這是由於系統是用鏈表來儲存的空閑記憶體位址的,自然是不連續的,而鏈表的遍曆方向是由低地址向高地址。堆的大小受限於電腦系統中有效虛擬記憶體。由此可見,堆獲得的空間比較靈活,也比較大。

片段問題:對於堆來講,頻繁的new/delete勢必會造成記憶體空間的不連續,從而造成大量的片段,使程式效率降低。對於棧來講,則不會存在這個問題,因為棧是先進後出的隊列,他們是如此的一一對應,以至於永遠都不可能有一個記憶體塊從棧中間彈出

分配方式:堆都是動態分配的,沒有靜態分配的堆。棧有2種分配方式:靜態分配和動態分配。靜態分配是編譯器完成的,比如局部變數的分配。動態分配由alloca函數進行分配,但是棧的動態分配和堆是不同的,他的動態分配是由編譯器進行釋放,無需我們手工實現。

分配效率:棧是機器系統提供的資料結構,電腦會在底層對棧提供支援:分配專門的寄存器存放棧的地址,壓棧出棧都有專門的指令執行,這就決定了棧的效率比較高。堆則是C/C++函數庫提供的,它的機制是很複雜的。

以上就是10個面試者經常會碰到的Objective-C基礎面試題,如果你正好要去應聘iOS崗位那麼請回到文章開始重新認真閱讀吧。iOS開發還是相對比較有前途的,大家覺得呢?

ios 面試基礎問題

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.