1. 程式人生 > >回看以往北上廣深各公司iOS面試題

回看以往北上廣深各公司iOS面試題

回看以往的面試題,總結整理了一番

*面試心聲:總結起來就是把基礎的東西弄好,複雜的東西瞭解就ok了!

*此題庫是北上廣深杭各大小公司面試題。

*注:如今社會還是得靠本事,看面試題只是多了一個機會,珍惜機會的同時提高自己硬實力才是真理!

友情提示:題庫過長,全200道只能上傳100道,需要完整PDF文件,可進入小編iOS交流群:624212887,群檔案直接獲取,更多技術書籍,面試資料盡在此,歡迎入駐,交流探討

題庫:

1.給定一個字串,輸出本字串中只出現一次並且最靠前的那個字元的位置?比如“abaccddeeef”則是b,輸出2
答:

 int main()

{

char a[80] = "abaccddeeef\0"; char ch; int i, m, b[80]; int flag = 0; ch = getchar();//獲取一個字元 m = strlen(a); for (i = 0; i < m; ++i){ if (a[i] == ch){//找到了,直接判斷是否相等 b[flag] = i+1;//記錄位置 flag += 1; } } if (flag == 0)printf ("no"); else { printf ("%d\n", flag); for (i = 0; i < flag; i++){//對位置進行輸出,用迴圈 printf ("%d ", b[i]); } printf ("\n"); } return 0; } 

2.實現一個氣泡排序或者快速排序
答:氣泡排序:

intarray[5] = { 28,27,36,45,8}; for (int i = 0; i < 4; i++) { for(int j = 0; j < 4; j++) { if (array[j] > array [j + 1]){ int temp = array[j]; array[j] = array[j + 1]; array[j + 1] = temp; }}} for(int i = 0; i < 5; i++) { printf("%d\n",array[i]);} 

3.請編寫一個函式用於計算階乘


答:

 int f(int i) {intt=1,j; for(j=1;j<=i;j++) t=t*j; return t; } 

4.Cocoa Touch提供了幾種Core

Animation過渡類?

答:Cocoa Touch提供了4種Core

Animation過渡型別,分別為:交叉淡化、推擠、顯示和覆蓋。

5.iOS平臺怎麼做資料的持久化?coredata和sqlite有無必然聯絡?coredata是一個關係型資料嗎?

答:資料的持久化本質上都是就是寫檔案,但從邏輯上又分成很多種,比如寫入沙盒,比如存到網路上,比如寫入資料庫。

core data是對sqlite的封裝,因為sqlite是c語言的api,然而有人也需要obj-c的api,所以有了core data ,另外,core data不僅僅是把c的api翻譯成oc的api,還提供了一些管理的功能,使用更加方便。

App升級之後資料庫欄位或者表有更改會導致crash,CoreData的版本管理和資料遷移變得非常有用,手動寫sql語句操作還是麻煩一些。

CoreData不光能操縱SQLite,CoreData和iCloud的結合也很好,如果有這方面需求的話優先考慮CoreData。

CoreData並不是直接操縱資料庫,比如:使用CoreData時不能設定資料庫的主鍵,目前仍需要手動操作。

6.Object-c的類可以多重繼承麼?可以實現多個介面麼?category是什麼?重寫一個類的方式用繼承好還是分類好?為什麼?

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

7.#import跟#include有什麼區別,@class呢?#import<>跟#import””有什麼區別?

答: #import是Objective-C匯入標頭檔案的關鍵字,#include是C/C++匯入標頭檔案的關鍵字,使用#import標頭檔案會自動只匯入一次,不會重複匯入,相當於#include和#pragma once;@class告訴編譯器某個類的宣告,當執行時,才去檢視類的實現檔案,可以解決標頭檔案的相互包含;#import<>用來包含系統的標頭檔案,#import””用來包含使用者標頭檔案。

8.屬性readwrite,readonly,assin,retain,copy,nonatomic各是什麼作用,在哪種情況下用?

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

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

assign是賦值特性,setter方法將傳入引數賦值給例項變數;僅設定變數時;

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

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

nonatomic非原子操作,決定編譯器生成的setter

getter是否是原子操作,atomic表示多執行緒安全,一般使用nonatomic

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

答:

 -(void)setName:(NSString *) str

{

[str retain];

[name release];

name = str;

}

- (void)setName:(NSString *)str { id t = [str copy]; [name release]; name = t; } 
10.對於語句NSString *obj =[[NSData alloc] init]; obj在編譯時和執行時分別是什麼型別的物件?

答:編譯時是NSString的型別;執行時是NSData型別的物件

11.當前已經程式設計實現函式:int

rand100().該函式可返回0~99的隨機整數,且可以保證等概率.請利用該函式實現int rand10000(),要求等概率返回0~9999的隨機數.(不可使用其他的系統函式)

12.湯姆現在要在家裡舉行宴會,他雖然有很多筷子,但這些筷子的長度並不完全相同,先已知每根筷子的長度,要求每位客人都能拿到兩根長度相同的筷子,求最多可邀請的客人數.

程式設計實現:int getMax(int arrLength[N])

13.現有一個整數序列,你可以交換其中的任意兩個數以得到一個新序列.求共能得到多少種可能結果.(注意:3,3,3,3無論怎麼交換,只能得到一個序列)

程式設計實現:int getTotal(int arrOrigin[N])

14.現有一個M行N列的陣列,要求安裝反向斜對角線(右上->左下)的方式,列印該陣列.程式設計實現:intprintMatrix[int arrMatrix[M][N]]
下面樣例的列印順序為:

0->1->4->2->5->8->3->6->9->7->10->11

123

4567

8910 11

15.在UIKit中,frame與bounds的關係是( C )

A. frame是bounds的別名

B. frame是bounds的繼承類

C. frame的參考系是父規圖座標, bounds的參考系是自身的座標

D.frame的參考系是自身座標,bounds的參考系是父規圖的座標

16.一個類的delegate(代理)的作用不正確的是( D )

A.delegate中的函式在其他類中實現

B.主要用於不同型別的物件之間一對一傳遞訊息

C.沒有指派則不會觸發

D.可以一個物件的delegate指派給多個其他型別的物件

17.下面關於Objective-C記憶體管理的描述錯誤的是(A )

A.當使用ARC來管理記憶體時,物件的retain,dealloc方法不會被呼叫

B.autoreleasepool在drain的時候會釋放在其中分配的物件

C.當使用ARC來管理記憶體時,線上程中大量分配物件而不用autoreleasepool則可能會造成記憶體洩露

D.在使用ARC的專案中不能使用NSZone

18.下面block定義正確的是( A )

A.tyoedef void(^SuccessBlock)(BOOLsuccess);

B. tyoedef void(^SuccessBlock)(NSStringvalue,BOOL success);

C. tyoedef void^(SuccessBlock)(NSStringvalue,BOOL success);

D. tyoedef void^(SuccessBlock)(NSString*value);

19.UIButton從子類到父類一次繼承自:( D )

A. UIView-> UIViewController->UIController

B. UIResponder-> UIControl-> UIView

C. UIControl-> UIResponder->UIViewController

D. UIControl-> UIView-> UIResponder

20.下列關於iOS開發中類方法的使用描述,錯誤的是:( C )

A.類方法可以呼叫類方法

B.類方法不可以呼叫例項方法,但是類方法可以通過建立物件來訪問例項方法

C.類方法不可以使用例項變數,包括self(可以使用self)

D.類方法作為訊息,可以被髮送到類或者物件裡面去

21.什麼情況下使用關鍵字weak和assign有何不同?

答:assign指標賦值,不對引用計數操作,使用之後如果沒有置為nil,可能就會產生野指標;而weak一旦不進行使用後,永遠不會使用了,就不會產生野指標!

22.Object-C的類可以多重繼承麼?可以實現多個介面麼?Category是什麼?重寫一個類方法的方法用繼承好還是分類好?為什麼?*8

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

23.如何用iOS裝置進行效能測試?

答: Profile-> Instruments ->Time Profiler

24.我們說的oc是動態執行時語音是什麼意思?

答案:多型。主要是將資料型別的確定由編譯時,推遲到了執行時。這個問題其實淺涉及到兩個概念,執行時和多型。簡單來說,執行時機制使我們直到執行時才去決定一個物件的類別,以及呼叫該類別物件指定方法。多型:不同物件以自己的方式響應相同的訊息的能力叫做多型。意思就是假設生物類(life)都用有一個相同的方法-eat;那人類屬於生物,豬也屬於生物,都繼承了life後,實現各自的eat,但是呼叫是我們只需呼叫各自的eat方法。也就是不同的物件以自己的方式響應了相同的訊息(響應了eat這個選擇器)。因此也可以說,執行時機制是多型的基礎。

25.你的專案什麼時候選擇使用GCD,什麼時候選擇NSOperation?

答:專案中使用NSOperation的優點是NSOperation是對執行緒的高度抽象,在專案中使用它,會使專案的程式結構更好,子類化NSOperation的設計思路,是具有面向物件的優點(複用、封裝),使得實現是多執行緒支援,而介面簡單,建議在複雜專案中使用。專案中使用GCD的優點是GCD本身非常簡單、易用,對於不復雜的多執行緒操作,會節省程式碼量,而Block引數的使用,會是程式碼更為易讀,建議在簡單專案中使用。

26.讀檔案是輸入流還是輸出流?

東西讀入記憶體就是輸入流東西從記憶體寫到記錄儲存輸出流而我們本身就以記錄儲存為原點所有會有不解的感覺~java io流按照java io流的方向可以分為輸入流和輸出流輸入流是將資源資料讀入到緩衝Buffer中,輸出流是將緩衝Buffer中的資料按照指定格式寫出到一個指定的位置,所以這兩個流一般同時使用,才有意義。例如你要做檔案的上傳,你要先用輸入流將待上傳檔案讀入緩衝,然後用輸出流將檔案寫出到網路伺服器的一個位置,則上傳成功;若是檔案下載,則先獲得輸入流,來讀取網路伺服器中的一個檔案,然後用輸出流寫到本地的一個檔案中;還有例如檔案的拷貝,也是先用輸入流讀再用輸出流寫出去的很好的例子,你可以先做一個小例子試試,對你理解java io有幫助

27.簡述CALayer和UIView的關係

答:UIView和CALayer是相互依賴的關係。UIView依賴與calayer提供的內容,CALayer依賴uivew提供的容器來顯示繪製的內容。歸根到底CALayer是這一切的基礎,如果沒有CALayer,UIView自身也不會存在,UIView是一個特殊的CALayer實現,添加了響應事件的能力。

結論:

UIView來自CALayer,高於CALayer,是CALayer高層實現與封裝。UIView的所有特性來源於CALayer支援。

28.宣告一個靜態方法和一個例項方法

答:先說例項方法,當你給一個類寫一個方法,如果該方法需要訪問某個例項的成員變數時,那麼就將該方法定義成例項方法。一類的例項通常有一些成員變數,其中含有該例項的狀態資訊。而該方法需要改變這些狀態。那麼該方法需要宣告成例項方法。

靜態方法正好相反,它不需要訪問某個例項的成員變數,它不需要去改變某個例項的狀態。我們把該方法定義成靜態方法。

29.常見的Object-C的資料型別有哪些?和Cd基本資料型別有什麼區別?

答: object-c的資料型別有nsstring,nsnumber,nsarray,nsmutablearray,nsdata等等,這些都是class,建立後便是物件,而c語言的基本資料型別int,只是一定位元組的記憶體空間,用於存放數值;而object-c的nsnumber包含有父nsobject的方法和nsnumber自己的方法,可以完成複雜的操作。

30.UIView的動畫效果有哪些

如UIViewAnimationOptionCurveEaseInOut

UIViewAnimationOptionCurveEaseIn

UIViewAnimationOptionCurveEaseOut

UIViewAnimationOptionTransitionFlipFromLeft

UIViewAnimationOptionTransitionFlipFromRight

UIViewAnimationOptionTransitionCurlUp

UIViewAnimationOptionTransitionCurlDown

31.你瞭解svn,cvs等版本控制工具麼?

答:瞭解.

32.靜態連結庫(瞭解一下)

答:靜態庫是程式程式碼的集合,是共享程式碼的一種方式

靜態庫是閉源的存在形式.a和.framework

連線時,靜態庫會被完全的複製到可執行檔案中,被多次使用就會有冗餘拷貝,相當於java裡的jar包,把一些類編譯到一個包中,在不同的工程中如果匯入此檔案就可以使用裡面的類,

33.什麼是沙箱模型?哪些操作是屬於私有api範疇?

答:1、應用程式可以在自己的沙盒裡運作,但是不能訪問任何其他應用程式的沙盒。

2、應用程式間不能共享資料,沙盒裡的檔案不能被複制到其他應用程式資料夾中,也不能把其他應用程式資料夾中的檔案複製到沙盒裡。

3、蘋果禁止任何讀、寫沙盒以外的檔案,禁止應用程式將內容寫到沙盒以外的資料夾中。

4、沙盒根目錄裡有三個資料夾:Documents,一般應該把應用程式的資料檔案存到這個資料夾裡,用於儲存使用者資料或其他應該定期備份的資訊。Library,下有兩個資料夾,Caches儲存應用程式再次啟動所需的資訊,Preferences包含應用程式偏好設定檔案,不過不要在這裡修改偏好設定。temp,存放臨時檔案,即應用程式再次啟動不需要的檔案。

沙盒根目錄裡有三個資料夾分別是:documents,tmp,Library。

1、Documents目錄:您應該將所有de應用程式資料檔案寫入到這個目錄下。這個目錄用於儲存使用者資料或其它應該定期備份的資訊。

2、AppName.app目錄:這是應用程式的程式包目錄,包含應用程式的本身。由於應用程式必須經過簽名,所以您在執行時不能對這個目錄中的內容進行修改,否則可能會使應用程式無法啟動。

3、Library目錄:這個目錄下有兩個子目錄:Caches和Preferences

Preferences目錄:包含應用程式的偏好設定檔案。您不應該直接建立偏好設定檔案,而是應該使用NSUserDefaults類來取得和設定應用程式的偏好.

Caches目錄:用於存放應用程式專用的支援檔案,儲存應用程式再次啟動過程中需要的資訊。

4、tmp目錄:這個目錄用於存放臨時檔案,儲存應用程式再次啟動過程中不需要的資訊。

iOS沙盒(sandbox)中的幾個目錄獲取方式:

//獲取沙盒主目錄路徑

NSString *homeDir = NSHomeDirectory();

//獲取Documents目錄路徑

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *docDir = [paths objectAtIndex:0]; //獲取Caches目錄路徑 NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); NSString *cachesDir = [paths objectAtIndex:0]; //獲取tmp目錄路徑 NSString *tmpDir = NSTemporaryDirectory(); //獲取當前程式包中一個圖片資源(apple.png)路徑 NSString *imagePath = [[NSBundle mainBundle] pathForResource:@"apple" ofType:@"png"]; UIImage *appleImage = [[UIImage alloc] initWithContentsOfFile:imagePath]; 例子: NSFileManager* fm=[NSFileManagerdefaultManager]; if(![fm fileExistsAtPath:[selfdataFilePath]]){ //下面是對該檔案進行制定路徑的儲存 [fm createDirectoryAtPath:[selfdataFilePath] withIntermediateDirectories:YES attributes:nil error:nil]; //取得一個目錄下得所有檔名 NSArray *files = [fm subpathsAtPath: [selfdataFilePath] ]; //讀取某個檔案 NSData *data = [fm contentsAtPath:[selfdataFilePath]]; //或者 NSData *data = [NSDatadataWithContentOfPath:[self dataFilePath]]; } 

34.協議是什麼?有什麼作用?

協議:宣告一系列的方法,可由任何類實施,即使遵守該協議的類沒有共同的超類。協議方法定義了獨立於任何特定類的行為。簡單的說,協議就是定義了一個介面,其他類負責來實現這些介面。如果你的類實現了一個協議的方法時,則說該類遵循此協議。

協議的作用:

1.定義一套公用的介面(Public)

@required:必須實現的方法

@optional:可選實現的方法(可以全部都不實現)

2.委託代理(Delegate)傳值:

它本身是一個設計模式,它的意思是委託別人去做某事。

比如:兩個類之間的傳值,類A呼叫類B的方法,類B在執行過程中遇到問題通知類A,這時候我們需要用到代理(Delegate)。

又比如:控制器(Controller)與控制器(Controller)之間的傳值,從C1跳轉到C2,再從C2返回到C1時需要通知C1更新UI或者是做其它的事情,這時候我們就用到了代理(Delegate)傳值。

35.你在開發大型專案時,如何進行記憶體洩露檢測的?

可以通過xcode的自帶工具run---start with performance tool裡有instruments下有個leaks工具,

啟動此工具後,執行專案,工具裡可以顯示記憶體洩露的情況,雙擊可找到原始碼位置,可以幫助進行記憶體洩露的處理。

36.你實現過一個框架或者庫以供別人使用麼?如果有,請談一談構建框架或者庫是的經驗;如果沒有,請設想和設計框架的public的API,並指出大概需要如何做,需要注意一些什麼方面,來方便別人容易地使用你的框架.

37.app從建立應用到上架過程(appstore)
在你開始將程式提交到App Store之前,你需要有一個App ID,一個有效的釋出證書,以及一個有效的Provisioning profile。
在itunesconnect網站上,建立app應用,設定對應資訊,上傳app打包檔案,提交等待稽核

38.用你熟悉的語音,程式設計實現Fibonacci數列:int F(intn);

Fibonacci數列遞推式F(n) = F(n-1) +F(n-2)

F(1) = 1

F(2) = 2 F(3) = 3 F(4) = 5 F(5) = 8 int F(int n){ if(n == 1){ return1; } return f(n-1)+f(n-2); } 

39.給定兩個排好序的陣列A,B,請寫一個函式,從中找出他們的公共元素:findCommon(A,B)並列舉其他可能的查詢方法,越多越好
例如:

Array A = [1, 3, 5, 6, 9] Array B = [2, 3, 6, 8, 10] 返回結果= [3, 6] void FindCommon(int* a, int* b, int n) { int i = 0; int j = 0 ; while(i < n && j < n){ if (a[i] < b[j]) ++i ; else if(a[i] == b[j]) { cout << a[i] << endl ; ++i ; ++j ; } else// a[i] > b[j] ++j ; } 

40.KVO的實現原理?

答:KVO:當指定的物件的屬性被修改了,允許物件接收到通知的機制。

41.如何給一個物件的私有屬性賦值?

答:利用KVC即鍵值編碼來給物件的私有屬性賦值.

42.block的本質是什麼?為啥在block裡面更改外面變數的值,要給外面的變數加_block修飾,加_block修飾的原理是什麼?

答: (1) block本質是一個數據型別,多用於引數傳遞,代替代理方法, (有多個引數需要傳遞或者多個代理方法需要實現還是推薦使用代理方法),少用於當做返回值傳遞. block是一個OC物件,它的功能是儲存程式碼片段,預先準備好程式碼,並在需要的時候執行.

(2)因為使用block程式碼塊可能會引起內部循壞引用,所以應在block定義前加上修飾

43.block在哪種情況下會造成迴圈引用,如何解決?

答:(1)從兩方面分析造成迴圈引用問題

當self擁有一個block的時候,在block又呼叫self的方法(或者self所擁有的某個屬性)。形成你中有我,我中有你,這種時候會造成迴圈引用

把某個例項變數變成本地臨時變數,強引用將直接指向這個本地臨時變數,但本地臨時變數一般都會很快釋放,所以一般考慮第一種情況

(2)解決方案:對block進行修飾__weak(arc)或__block(mrc)

44.NSURLSession在什麼情況下回存在迴圈引用的問題,怎麼解決?

答: (1)在使用NSURLSession簽訂其代理的時候會存在迴圈引用問題,因為其代理是retain強引用

(2)解決方案

(1)在下載完成後取消NSURLSession會話並釋放Session,賦值為nil。

(2)再檢視將要消失時也執行同樣的操作。為了防止沒有下載完成就跳轉控制器。

具體如下:

/**檢視將要消失的時候,取消session*/

- (void)viewWillDisappear:(BOOL)animated

{

[superviewWillDisappear:animated];

//任務完成,取消NSURLSession

[self.sessioninvalidateAndCancel]; //釋放會話 self.session =nil; } 

45.如何自己實現GET快取?

答:1.使用GET請求資料

2.iOS系統SDK已經做好了快取。需要的僅僅是設定下記憶體快取大小、磁碟快取大小、以及快取路徑,程式碼如下

NSURLCache *urlCache = [[NSURLCache alloc] initWithMemoryCapacity:4 * 1024 * 1024 diskCapacity:20 * 1024 * 1024 diskPath:nil];

[NSURLCache setSharedURLCache:urlCache];

46.在使用SQLite過程中,如果多條執行緒同時操作同一資料庫會造成什麼問題,怎麼解決?

答:(1)容易造成系統崩潰

(2)解決方案:開啟第3種序列模式,使用一個類(單例方式)操作資料庫

47.如果提交一個Json格式的資料給後臺伺服器,後臺伺服器返回的是一段普通文字,用NSURLConnection/NSURLSession/AFN分別如何實現?

答:1.使用NSURLConnection傳送請求的步驟很簡單

(1)建立一個NSURL物件,設定請求路徑(設定請求路徑)

(2)傳入NSURL建立一個NSURLRequest物件,設定請求頭和請求體(建立請求物件)

(3)使用NSURLConnection傳送NSURLRequest(傳送請求)

2.使用NSURLSession傳送請求的步驟很簡單

1)確定請求路徑(一般由公司的後臺開發人員以介面文件的方式提供),GET請求引數直接跟在URL後面

2)建立請求物件(預設包含了請求頭和請求方法【GET】),此步驟可以省略

3)建立會話物件(NSURLSession)

4)根據會話物件建立請求任務(NSURLSessionDataTask)

5)執行Task

6)當得到伺服器返回的響應後,解析資料(XML|JSON|HTTP)

48.請描述一下SDWebImage內部實現的原理

答:SDWebImage底層實現有沙盒快取機制,主要由三塊組成

1、記憶體圖片快取

2、記憶體操作快取

3、磁碟沙盒快取

49.你對runtime都有哪些瞭解,你在實現開發過程中,或是你在所使用的第三方框架中,有沒有使用過runtime的,如果有,請你描述一下其內部實現機制

答:Runtime:runtime是一套比較底層的純C語言API,屬於1個C語言庫,包含了很多底層的C語言API。在我們平時編寫的OC程式碼中,程式執行過程時,其實最終都是轉成了runtime的C語言程式碼, runtime算是OC的幕後工作者.

50.執行緒間怎麼通訊?
(1)GCD:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{

//下載圖片

UIImage *image = nil; dispatch_async(dispatch_get_main_queue(),^{ //回到主執行緒 }); (2)NSThread的執行緒通訊 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{ //下載圖片 UIImage *image = nil; [selfperformSelector:@selector(settingImage:) onThread:[NSThread mainThread]withObject:image waitUntilDone:YES modes:nil]; } 

這種情況也適用於子執行緒之間的通訊。

51.網路圖片處理問題中怎麼解決一個相同的網路地址重複請求的問題?

答案:利用字典圖片地址為key,下載操作為value

52.自動釋放池底層怎麼實現?

答:自動釋放池以棧的形式實現:當你建立一個新的自動釋放池時,它將被新增到棧頂.當一個物件收到傳送autorelease訊息時,他被新增到當前執行緒的處於棧頂的自動釋放池中,當自動釋放池被回收時,他們從棧中被刪除,並且會給池子裡面所有的物件都會做一次release操作

53.不用中間變數,用兩種方法交換A和B的值

A = A+B;

B = A - B;

A = A - B;

54.簡單描述一下客戶端的快取機制?

答案:無法簡述,詳細瞭解下,明白了夠裝逼就好http://www.cnblogs.com/wendingding/p/3950198.html

55.控制器View的生命週期及相關函式是什麼?你在開發中是如何用的?

1.在檢視顯示之前呼叫viewWillAppear;該函式可以呼叫多次;

2.檢視顯示完畢,呼叫viewDidAppear;

3.在檢視消失之前呼叫viewWillDisAppear;該函式可以呼叫多次(如需要);

4.在佈局變化前後,呼叫viewWill/DidLayoutSubviews處理相關資訊;

56.NSRunLoop的實現機制,及在多執行緒中如何使用?

答案:NSRunLoop是iOS的訊息機制的處理模式

1NSRunloop的主要作用:控制runloop裡面執行緒的執行和休眠,在有事情做的時候使擋牆NSRunloop控制的執行緒工作,沒有事情做讓當前runloop的控制執行緒休眠.

2.runloop就是一直在迴圈檢測,從執行緒start到執行緒end,檢測inputsourse(如點選,雙擊等操作)非同步時間,檢測timesourse同步事件,見到檢測到輸入源會執行處理函式,首先會產生通知,corefunction向執行緒新增runloop observers來監聽事件,意在監聽事件發生時來做處理。

3.runloopmode是一個集合,包括監聽:事件源,定時器,以及需通知的runloop observers

1.只有在為你的程式建立次執行緒的時候,才需要執行run loop。對於程式的主執行緒而言,run loop是關鍵部分。Cocoa提供了執行主執行緒run loop的程式碼同時也會自動執行run loop。IOS程式UIApplication中的run方法在程式正常啟動的時候就會啟動run loop。如果你使用xcode提供的模板建立的程式,那你永遠不需要自己去啟動run loop

2.在多執行緒中,你需要判斷是否需要run loop。如果需要run loop,那麼你要負責配置run loop並啟動。你不需要在任何情況下都去啟動run loop。比如,你使用執行緒去處理一個預先定義好的耗時極長的任務時,你就可以毋需啟動run loop。Run loop只在你要和執行緒有互動時才需要

57.簡單說一下APP的啟動過程,從main檔案開始說起

進入main函式,在main.m的main函式中執行了UIApplicationMain這個方法,這是ios程式的入口點!

int UIApplicationMain(int argc, char argv[], NSString principalClassName, NSString *delegateClassName)

argc、argv:ISO C標準main函式的引數,直接傳遞給UIApplicationMain進行相關處理即可

principalClassName:指定應用程式類,該類必須是UIApplication(或子類)。如果為nil,則用UIApplication類作為預設值

delegateClassName:指定應用程式類的代理類,該類必須遵守UIApplicationDelegate協議

此函式會根據principalClassName建立UIApplication物件,根據delegateClassName建立一個delegate物件,並將該delegate物件賦值給UIApplication物件中的delegate屬性

lUIApplication物件會依次給delegate物件傳送不同的訊息,接著會建立應用程式的main runloop(事件迴圈),進行事件的處理(首先會呼叫delegate物件的application:didFinishLaunchingWithOptions:)

程式正常退出時這個函式才返回。如果程序要被系統強制殺死,一般這個函式還沒來得及返回程序就終止了

58.第三方API你是怎麼用的?

cocoa pod匯入

59.用預處理指令#define宣告一個常數,用以表明一年中有多少秒?(忽略閏年問題)

答:#define second 3652460*60

60.UITableView需要實現哪些代理?列出UITableView代理中必須實現的與其他一些常用的函式.

答:

-( NSInteger )tableView:( UITableView *)tableViewnumberOfRowsInSection:( NSInteger)section;

一組有多少行

-( UITableViewCell *)tableView:( UITableView *)tableViewcellForRowAtIndexPath:(NSIndexPath *)indexPath;

每行中的cell的實現以上兩個方法為必須要實現的

常用的有

  • ( void )tableView:( UITableView )tableViewdidSelectRowAtIndexPath:( NSIndexPath)indexPath

選中以後事件設定

-( CGFloat )tableView:( UITableView )tableViewheightForRowAtIndexPath:( NSIndexPath)indexPath

設定cell的高度

等等。。。。。

61.在iOS上開發一個應用程式時怎麼做的?

答:首先,要有一個MAC系統(買一臺蘋果電腦,蘋果本或者MACmini),沒有這個條件可以裝一個黑蘋果的mac系統或者裝一個虛擬機器。然後裝一個X-CODE開發環境。要是學習ios開發的話,這些就可以了。如果要開發、上線的話,就得準備iphone/ipod、ipad做為測試機,到蘋果申請一個開發者賬號,每年的年費99美元。再然後接著就可以開發你的程式了,開發完畢之後,釋出到App store上面,通過稽核就可以了。

62.C++和Objective-C的混合使用,以下描述錯誤的是()

A. cpp檔案只能使用C/C++程式碼

B. cpp檔案include的標頭檔案中,可以出現objective-C的程式碼

C. mm檔案中混用cpp直接使用即可

D. cpp使用objective-C的關鍵是使用介面,而不能直接使用程式碼

63.以下哪一段程式碼不會丟擲異常( C& D )

A. NSArray array = @[1, 2, 3];NSNumbernumber = array[3];// @[@1,@ 2,@ 3]

B. NSDictionary *dict = @{@”key”:

nil};//value不能為空

C. NSString *str = nil; NSString *str2 =[str substringFromIndex:3];

D. NSString *str = @”hi”;NSString *str2 =[str substringFromIndex:3];

64.在沒有navigationController的情況下,要從一個ViewController切換到另一個ViewController應該()

A.{self.navigationControllerpushViewController:nextViewController animated:YES};

B.{self .viewaddSubview:nextViewController}

C. {selfpresentModalViewController:nextViewController animated:YES};

D. {selfpushViewController:nextViewController animated:YES};

分析:A、C都需要有navigationController,B一個控制器的view是無法載入另一個控制器的view的,所以選C!

65.關於下面執行緒管理錯誤的是()

//不確定

A.GCD在後端管理著一個執行緒池

B.NSOperationQueue是對NSthread的更高層的封裝,對

C.NSThread需要自己管理執行緒的生命週期

D.GCD可以根據不同優先順序分配執行緒,對

66.iOS中的資料持久化方式(D)

A.屬性列表

B.物件歸檔

C.SQLite和CoreData

D.以上全部+物件歸檔

67.設有一下巨集定義:

defineN4

defineY(n)((N + 1) * n)

則執行語句: Y(5 + 1)為:(26)

68.如下程式用於把"blue"字串返回,請指出其中的錯誤.

//不確定

char *GetBlue()

{

char *pcColor; char*pcNewColor; pcColor = “blue”; pcNewColor =(char*)malloc(strlen(pcColor)); strcpy(pcNewColor, pcColor); return pcNewColor; } 

答:strcpy是一個字串拷貝的函式,它的函式原型為strcpy(char *dst, c*****t char *src);將src開始的一段字串拷貝到dst開始的記憶體中去,結束的標誌符號為'\0',由於拷貝的長度不是由我們控制的,所以這個字串拷貝很容易出錯

69.常見的object-c的資料型別有哪些,和C的基本資料型別有什麼區別?如:NSInteger和int

答:object的資料型別由NSString,NSNumber,NSArray,NSMutableArray,NSData等等,這些都是class,建立後便是物件,而C語言的基本資料型別int,只是一定位元組的記憶體空間,用於存放數值,NSInteger是基本的資料型別,並不是NSNumber的子類,當然也不是NSObject的子類。NSInteger是基本資料型別int或者Long的別名(NSInteger的定義typedef long NSInteger)它的區別在於,NSInteger會根據系統是32位還是64位來決定是本身int還是long.

70.iOS有垃圾回收機制嗎?它是以怎樣的機制來工作的?

答: OC是支援垃圾回收機制的(Garbage collection簡稱GC),但是apple的移動終端中,是不支援GC的,Mac桌面系統開發中是支援的.

移動終端開發是支援ARC(Automatic

Reference Counting的簡稱),ARC是在IOS5之後推出的新技術,它與GC的機制是不同的。我們在編寫程式碼時,不需要向物件傳送release或者autorelease方法,也不可以呼叫delloc方法,編譯器會在合適的位置自動給使用者生成release訊息(autorelease),ARC的特點是自動引用技術簡化了記憶體管理的難度.

71.請使用gcd完成如下任務,執行併發任務task1,task1完成後update UI.
答:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{

//task1:

NSLog(@"執行task1"); //更新UI dispatch_async(dispatch_get_main_queue(), ^{ NSLog(@"更新UI"); }); }); 

72.為什麼在主執行緒中更新UI?子執行緒中想要更新UI怎麼做?

答:(1)在子執行緒中不能更新UI,除了極少數UI外,其他UI更新要等到子執行緒執行完畢後回到主執行緒中進行更新。如果子執行緒一直在執行,則子執行緒中UI更新的函式棧主執行緒無法得知,即UI無法更新;

(2)回到主執行緒中進行UI更新;

73.簡述通過Storyboard實現一個tableView

(自定義cell的關鍵步驟).

答:首先建立自己的自定義cell的類,我們叫做CustomCell,要繼承於UITableViewCell。在這個類中定義自己所需要的控制元件。

然後,開啟storyboard,選擇自己要新增自定義cell的UIViewController,我們叫它為ViewController。在UITableView裡面新增一個cell(或者修改原有的cell)。將cell的style改為custom,將cell的類改為CustomCell,將identifier改為CustomCellIdentifier。然後,可以在cell中新增控制元件,將控制元件和剛才在CustomCell中定義的控制元件連起來。

最後,在ViewController的UITableView的tableView:cellForRowAtIndexPath:代理方法中新增以下程式碼:

[plain]

CustomCell*cell=[tableViewdequeueReusableCellWithIdentifier:@"CustomCellIdentifier"];

這樣,就建立了一個cell,可以在這句程式碼之後對自己新增的控制元件進行設定。

74.如何生成同時支援多個架構(simulator,arm7,arm64)的通用靜態庫?

答:ValidArchitectures設定為:armv7|armv7s|arm64|i386|x86_64;

Architectures設定不變(或根據你需要):armv7|arm64;

然後分別選擇iOS裝置和模擬器進行編譯,最後找到相關的.a進行合包,使用lipo -create真機庫.a的路徑模擬器庫.a的的路徑-output合成庫的名字.a;

這樣就製作了一個通用的靜態庫.a;

75.請寫出一個xml檔案,用於描述一個書架,書架上有2本書,書本的類別(category)分別是cooking,children.要求tag中包含書名(title),作者(author).類別(category)要用屬性表示.
答:

書名1<\title>

作者1<\author>

<\book> 書名2<\title> 作者2<\author> <\book> 

76.strcpy和memcpy的最大區別是什麼?

答:1、複製的內容不同。strcpy只能複製字串,而memcpy可以複製任意內容,例如字元陣列、整型、結構體、類等。

2、複製的方法不同。strcpy不需要指定長度,它遇到被複制字元的串結束符"\0"才結束,所以容易溢位。memcpy則是根據其第

3個引數決定複製的長度。

3、用途不同。通常在複製字串時用strcpy,而需要複製其他型別資料時則一般用memcpy

108.g++, ld是什麼?宣告編譯選項–DSUPPORT_BLUETOOTH =

1有什麼作用?

答: g++是GNU的c++編譯器;

[email protected]用途

答:@class一般用於標頭檔案中宣告某個類的例項變數的時候用到.它只是宣告,至於內部的實現是沒有告訴編譯器的.

78.delegate使用assign or retain簡述理由.

答:assign,防止出現迴圈引用;

79.NSString與NSData之間的轉換過程中要特別注意的事項是什麼?
解:

NSString轉換成NSData物件

NSData* xmlData = [@"testdata"dataUsingEncoding:NSUTF8StringEncoding]; NSData轉換成NSString物件 NSData * data; NSString *result = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; NSData轉換成char* NSData *data; char *test=[data bytes]; char*轉換成NSData物件 byte* tempData = malloc(sizeof(byte)*16); NSData *content=[NSData dataWithBytes:tempData length:16]; 

轉換過程中要注意NSData的編碼格式問題.

解決方法:

先設定斷點然後在控制檯po出NSData的變數,看看會顯示什麼。

如果po出的NSData是可閱讀的,直接能看到文字的內容,則使用[NSString stringWithFormat:NSData] (這裡的NSData指的是你需要轉換成NSString的NSData變數)即可。

如果po出的NSData是不可閱讀的亂碼,那一般都是有編碼格式的,最常用的是NSUTF8StringEncoding,另外還有NSASCIIStringEncoding等,你可以在Apple文件裡找到編碼格式的那個列舉型別,挨個嘗試。

80.請用程式碼如何判斷某個物件obj是否支援某個method.
解:

if ([srespondsToSelector:@selector(print:)]) {

[s print:@"支援這個方法"];

}

81.請用簡單的程式碼展示@protocol的定義及實現.
解:

#warning代理第一步:宣告協議

@protocol MarryMe

-(void)makeMoney; @end #warning代理第二步:宣告代理 @property(nonatomic,assign)id myDeleget; .m檔案中 #warning代理第三步:代理人執行協議方法 [self.myDeleget makeMoney]; 代理人.m檔案中 #warning代理第四步:簽訂協議 @interface Boy : NSObject Girl *girl = [[Girl alloc] init]; #warning代理第五步:成為代理人 girl.myDeleget = self; [girl getMessage:message]; #warning協議代理第六步:實現協議方法 -(void)makeMoney{ NSLog(@"aaa"); } 

82.請描述應聘崗位的未來職業規劃

解:答案不唯一,如有需要請自行規劃活著百度.

83.3升的杯子一個,5升的杯子一個,杯子的形狀不規則,問怎麼才能得到4升的水,水無限多.(請寫出推理過程)

解:先將5升的杯子倒滿,然後把5升的杯子中的水倒入3升的杯子,倒滿後5升的杯子剩下2升.再把3升杯子中的水倒掉,把5升的杯子中剩餘的2升水倒入3升的杯子中,然後把5升的杯子倒滿.再用5升的杯子中的水給3升的杯子添滿,則5升的杯子中剩餘4升的水.

84.資料持久化儲存方案有哪些?

解:所謂的持久化,就是將資料儲存到硬碟中,使得在應用程式或機器重啟後可以繼續訪問之前儲存的資料。在iOS開發中,資料持久化的方案有5種方案:

plist檔案(屬性列表)

preference(偏好設定)

NSKeyedArchiver(歸檔)

SQLite 3

CoreData

85.網路通訊用過哪些方式?

解: ios裝置的網路通訊的方法,有如下兩個大類:

1、使用socket的方式進行通訊。

2、使用asynsocket類庫進行通訊。

86.如何處理多個網路請求併發的情況?

解: //瞭解(併發)當有多個執行緒在操作時,如果系統只有一個CPU,則它根本不可能真正同時進行一個以上的執行緒,它只能把CPU執行時間劃分成若干個時間段,再將時間段分配給各個執行緒執行,在一個時間段的執行緒程式碼執行時,其它執行緒處於掛起狀。.這種方式我們稱之為併發(Concurrent)。

遇到這種情況建議使用第三方的網路庫。比如AFNetworking。也可以通過GCD和NSOperationQueue來控制併發

87.簡單介紹一下KVC和KVO,他們都可以應用在哪些場景?

解: KVO:鍵值監聽,觀察某一屬性的方法

KVC:鍵值編碼,是一種間接訪問物件的屬性

88.講述一下runtime的概念,messagesend如果尋找不到響應的物件,會如何?

Objc Runtime其實是一個Runtime庫,它基本上是用C和彙編寫的,這個庫使得C語言有了面向物件的能力。

89. iOS能否嵌入其他語言?如何實現?

90. iOS移動開發最終生成的是什麼檔案?其結構如何?

最後打包完成是一個.ipa檔案可以通過iTunes和其他工具對有測試資格的手機進行安裝

91. UINavigationController如何要使用push/pop功能的話,需要怎麼實現

1.用UINavigationController的時候用pushViewController:animated

----返回之前的檢視[[selfnavigationController] popViewControllerAnimated:YES];

---ps:push以後會在navigation的left bar自動新增back按鈕,它的響應方法就是返回。所以一般不需要寫返回方法,點back按鈕即可。

2.其他時候用presentModalViewController:animated

[selfpresentModalViewController:controller animated:YES];//YES有動畫效果

-----返回之前的檢視[selfdismissModalViewControllerAnimated:YES];

3.切換檢視一般用不到addSubview

UINavigationController是導航控制器,如果pushViewController的話,會跳轉到下一個ViewController,點返回會回到現在這個ViewController;

如果是addSubview的話,其實還是對當前的ViewController操作,只是在當前檢視上面又“蓋”住了一層檢視,其實原來的畫面在下面呢,看不到而已。

92. UIView如何需要重新繪製整個介面,需要呼叫什麼方法?

UIView setNeedsDisplay和setNeedsLayout方法。首先兩個方法都是非同步執行的。而setNeedsDisplay會呼叫自動呼叫drawRect方法,這樣可以拿到UIGraphicsGetCurrentContext,就可以畫畫了。而setNeedsLayout會預設呼叫layoutSubViews,就可以處理子檢視中的一些資料。

綜上所述:setNeedsDisplay方便繪圖,而layoutSubViews方便出來資料

setNeedDisplay告知檢視它發生了改變,需要重新繪製自身,就相當於重新整理介面.

93. Plist檔案?結構是?

Plist檔案通常用於儲存使用者設定,也可以用於儲存捆綁的資訊,該功能在舊式的Mac OS中是由資源分支提供的。

Plist主要有Core Fundation型別構成,也可以將這些型別放入NSDictionary和NSArray以便後塍更復雜的資料型別

94. iOS裡面的二進位制資料型別是什麼?和NSString如何互相轉換?

NSData:用於儲存二進位制的資料型別

NSData類提供了一種簡單的方式,它用來設定緩衝區、將檔案的內容讀入緩衝區,或將緩衝區的內容寫到一個檔案。

不變緩衝區(NSData類),也可定義可變的緩衝區(NSMutableData類)。

NSData、NSString互轉:

NSData * data = [str dataUsingEncoding:NSUTF8StringEncoding];

//NSString轉換成NSData型別

NSString * newStr = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];

95. iOS裡面是否有GBK的字元編碼描述?即NSUTF8StringEncoding如果有,是怎樣的?

96. iOS裡面的手勢是如何實現的?

97.談談你瞭解的設計模式,你用過哪些,他們的缺點

1.MVC:優點:

1、開發人員可以只關注整個結構中的其中某一層;

2、可以很容易的用新的實現來替換原有層次的實現;

3、可以降低層與層之間的依賴;

4、有利於標準化;

5、利於各層邏輯的複用。

缺點:

1、降低了系統的效能。這是不言而喻的。如果不採用分層式結構,很多業務可以直接造訪資料庫,以此獲取相應的資料,如今卻必須通過中間層來完成。

2、有時會導致級聯的修改。這種修改尤其體現在自上而下的方向。如果在表示層中需要增加一個功能,為保證其設計符合分層式結構,可能需要在相應的業務邏輯層和資料訪問層中都增加相應的程式碼。

2.觀察者模式優點:

1、觀察者模式在被觀察者和觀察者之間建立一個抽象的耦合。被觀察者角色所知道的只是一個具體觀察者列表,每一個具體觀察者都符合一個抽象觀察者的介面。被觀察者並不認識任何一個具體觀察者,它只知道它們都有一個共同的介面。

由於被觀察者和觀察者沒有緊密地耦合在一起,因此它們可以屬於不同的抽象化層次。如果被觀察者和觀察者都被扔到一起,那麼這個物件必然跨越抽象化和具體化層次。

2、觀察者模式支援廣播通訊。被觀察者會向所有的登記過的觀察者發出通知,

觀察者模式缺點:

1、如果一個被觀察者物件有很多的直接和間接的觀察者的話,將所有的觀察者都通知到會花費很多時間。

2、如果在被觀察者之間有迴圈依賴的話,被觀察者會觸發它們之間進行迴圈呼叫,導致系統崩潰。在使用觀察者模式是要特別注意這一點。

3、如果對觀察者的通知是通過另外的執行緒進行非同步投遞的話,系統必須保證投遞是以自恰的方式進行的。

4、雖然觀察者模式可以隨時使觀察者知道所觀察的物件發生了變化,但是觀察者模式沒有相應的機制使觀察者知道所觀察的物件是怎麼發生變化的。

3.單例模式:主要優點:

1、提供了對唯一例項的受控訪問。

2、由於在系統記憶體中只存在一個物件,因此可以節約系統資源,對於一些需要頻繁建立和銷燬的物件單例模式無疑可以提高系統的效能。

3、允許可變數目的例項。

3.單例模式:主要缺點:

1、由於單利模式中沒有抽象層,因此單例類的擴充套件有很大的困難。

2、單例類的職責過重,在一定程度上違背了“單一職責原則”。

3、濫用單例將帶來一些負面問題,如為了節省資源將資料庫連線池物件設計為的單例類,可能會導致共享連線池物件的程式過多而出現連線池溢位;如果例項化的物件長時間不被利用,系統會認為是垃圾而被回收,這將導致物件狀態的丟失.

98.資料持久化儲存方案有哪些?
答:
(附網址:http://www.cocoachina.com/industry/20130328/5908.html)

iOS中的資料持久化方式,基本上有以下四種:屬性列表、物件歸檔、SQLite3和Core Data

1.屬性列表(NSUserDefaults,用於儲存配置資訊)

涉及到的主要類:NSUserDefaults,一般[NSUserDefaults standardUserDefaults]就夠用了

2.物件歸檔

要使用物件歸檔,物件必須實現NSCoding協議.大部分Object C物件都符合NSCoding協議,也可以在自定義物件中實現NSCoding協議,要實現NSCoding協議,實現兩個方法

3.SQLite3

SQLite的資料庫許可權只依賴於檔案系統,沒有使用者帳戶的概念。SQLite有資料庫級鎖定,沒有網路伺服器。它需要的記憶體,其它開銷很小,適合用於嵌入式裝置。你需要做的僅僅是把它正確的編譯到你的程式。

4.Core Data

Core Data本質上是使用SQLite儲存資料,但是它不需要編寫任何SQL語句。

要使用Core Data,需要在Xcode中的資料模型編輯器中設計好各個實體以及定義好他們的屬性和關係。之後,通過操作這些物件,結合Core Data完成資料的持久化:

99.網路通訊用過哪些方式?

(附網址:http://blog.csdn.net/chang6520/article/details/7967698)

同樣也是程式碼解釋

iOS裝置的網路通訊的方法,有如下兩個大類:

1、使用socket的方式進行通訊。

以TCP為利,對於TCP來說,是要區分服務端和客戶端的。服務端:通常的方法是服務端啟動後監聽,是否有客戶端連線,如果有連線,則建立與客戶端的通訊。客戶端的方法通常是連線服務端,當連線成功之後,就希望傳送資料了。

2、使用asynsocket類庫進行通訊。

100.如何處理多個網路請求併發的情況?
答:
(附網址:http://www.cnblogs.com/yanhuaxuanlan/p/4683557.html)

答案都是程式碼,大家可以開啟網址仔細閱讀

1.併發當有多個執行緒在操作時,如果系統只有一個CPU,則它根本不可能真正同時進行一個以上的執行緒,它只能把CPU執行時間劃分成若干個時間段,再將時間段分配給各個執行緒執行,在一個時間段的執行緒程式碼執行時,其它執行緒處於掛起狀。.這種方式我們稱之為併發(Concurrent)。

2.並行當系統有一個以上CPU時,則執行緒的操作有可能非併發。當一個CPU執行一個執行緒時,另一個CPU可以執行另一個執行緒,兩個執行緒互不搶佔CPU資源,可以同時進行,這種方式我們稱之為並行(Parallel)。

3.區別併發和並行是即相似又有區別的兩個概念,並行是指兩個或者多個事件在同一時刻發生;而併發是指兩個或多個事件在同一時間間隔內發生。

101.簡單介紹一下KVC和KVO,他們都可以應用在哪些場景?
答:
(附網址:http://b