iOS基礎面試題(一)

隨着iOS平臺開發的職位的增加,筆試、面試也越來越有“套路”,這裏我總結了一些面試題,多數是Objective-C的基礎知識,適合於面試新人,答案是我自己答的,不準確的地方,歡迎指出。

1.   Object-c的類可以多重繼承麼?可以實現多個接口麼?Category是什麼?重寫一個類的方式用繼承好還是分類好?爲什麼?

Object-c的類不可以多重繼承;可以實現多個接口,通過實現多個接口可以完成C++的多重繼承;Category是類別,一般情況用分類好,用Category去重寫類的方法,僅對本Category有效,不會影響到其他類與原有類的關係。

 

2.#import 跟#include 又什麼區別,@class呢, #import<> 跟 #import”"又什麼區別?

#import是Objective-C導入頭文件的關鍵字,#include是C/C++導入頭文件的關鍵字,使用#import頭文件會自動只導入一次,不會重複導入,相當於#include和#pragma once;@class告訴編譯器某個類的聲明,當執行時,纔去查看類的實現文件,可以解決頭文件的相互包含;#import<>用來包含系統的頭文件,#import””用來包含用戶頭文件。

 

3. 屬性readwrite,readonly,assign,retain,copy,nonatomic 各是什麼作用,在那種情況下用?

readwrite 是可讀可寫特性;需要生成getter方法和setter方法時

readonly 是隻讀特性  只會生成getter方法 不會生成setter方法 ;不希望屬性在類外改變

assign 是賦值特性,setter方法將傳入參數賦值給實例變量;僅設置變量時;

retain 表示持有特性,setter方法將傳入參數先保留,再賦值,傳入參數的retaincount會+1;

copy 表示拷貝特性,setter方法將傳入對象複製一份;需要完全一份新的變量時。

nonatomic 非原子操作,決定編譯器生成的setter getter是否是原子操作,atomic表示多線程安全,一般使用nonatomic


4.寫一個setter方法用於完成@property (nonatomic,retain)NSString *name,寫一個setter方法用於完成@property(nonatomic,copy)NSString *name

  1. - (void) setName:(NSString*) str  
  2. {  
  3.     [str retain];  
  4.     [name release];  
  5.     name = str;  
  6. }  
  7. - (void)setName:(NSString *)str  
  8. {  
  9.     id t = [str copy];  
  10.     [name release];  
  11.     name = t;  
  12. }  

 

5.對於語句NSString*obj = [[NSData alloc] init]; obj在編譯時和運行時分別時什麼類型的對象?

編譯時是NSString的類型;運行時是NSData類型的對象


6.常見的object-c的數據類型有那些, 和C的基本數據類型有什麼區別?如:NSInteger和int

object-c的數據類型有NSString,NSNumber,NSArray,NSMutableArray,NSData等等,這些都是class,創建後便是對象,而C語言的基本數據類型int,只是一定字節的內存空間,用於存放數值;NSInteger是基本數據類型,並不是NSNumber的子類,當然也不是NSObject的子類。NSInteger是基本數據類型Int或者Long的別名(NSInteger的定義typedef long NSInteger),它的區別在於,NSInteger會根據系統是32位還是64位來決定是本身是int還是Long。 

7.id 聲明的對象有什麼特性?

Id 聲明的對象具有運行時的特性,即可以指向任意類型的objcetive-c的對象;

 

8.Objective-C如何對內存管理的,說說你的看法和解決方法?

Objective-C的內存管理主要有三種方式ARC(自動內存計數)、手動內存計數、內存池。

 

9.內存管理的幾條原則時什麼?按照默認法則.那些關鍵字生成的對象

需要手動釋放?在和property結合的時候怎樣有效的避免內存泄露?

誰申請,誰釋放

遵循Cocoa Touch的使用原則;

內存管理主要要避免“過早釋放”和“內存泄漏”,對於“過早釋放”需要注意@property設置特性時,一定要用對特性關鍵字,對於“內存泄漏”,一定要申請了要負責釋放,要細心。

關鍵字alloc 或new 生成的對象需要手動釋放;

設置正確的property屬性,對於retain需要在合適的地方釋放,

 

10.如何對iOS設備進行性能測試?

Profile-> Instruments ->Time Profiler

11.看下面的程序,第一個NSLog會輸出什麼?這時str的retainCount是多少?第二個和第三個呢? 爲什麼?

  1. =======================================================  
  2. NSMutableArray* ary = [[NSMutableArray array] retain];  
  3. NSString *str = [NSString stringWithFormat:@"test"];  
  4. [strretain];  
  5. [aryaddObject:str];  
  6. NSLog(@"%@%d",str,[str retainCount]);  
  7. [strretain];  
  8. [strrelease];  
  9. [strrelease];  
  10. NSLog(@"%@%d",str,[str retainCount]);  
  11. [aryremoveAllObjects];  
  12. NSLog(@"%@%d",str,[str retainCount]);  
  13. =======================================================  

str的retainCount創建+1,retain+1,加入數組自動+1

3

retain+1,release-1,release-1

2

數組刪除所有對象,所有數組內的對象自動-1

1

12. Object C中創建線程的方法是什麼?如果在主線程中執行代碼,方法是什麼?如果想延時執行代碼、方法又是什麼?

線程創建有三種方法:使用NSThread創建、使用GCD的dispatch、使用子類化的NSOperation,然後將其加入NSOperationQueue;在主線程執行代碼,方法是performSelectorOnMainThread,如果想延時執行代碼可以用performSelector:onThread:withObject:waitUntilDone:

13.描述一下iOS SDK中如何實現MVC的開發模式

MVC是模型、試圖、控制開發模式,對於iOS SDK,所有的View都是視圖層的,它應該獨立於模型層,由視圖控制層來控制。所有的用戶數據都是模型層,它應該獨立於視圖。所有的ViewController都是控制層,由它負責控制視圖,訪問模型數據。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章