1. 程式人生 > >iOS面試題-1

iOS面試題-1

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.這段程式碼有什麼問題嗎:

答:@implementation Person
- (void)setAge:(int)newAge {
self.age = newAge;
}
@end

正確寫法
{
if(_age){
[_age release];
}
_age = [newAge retain];

}
死迴圈(擴充套件:知道如何正確寫setter和getter方法)

4. 屬性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

5.擷取字串”20 | http://www.baidu.com”中,”|”字元前面和後面的資料,分別輸出它們。

componentsSeparatedByString
NSString * str = @“20|http://www.baidu.com”;
for(NSString*s in [str componentsSeparatedByString:@"|"]){
NSLog(@“%@“,s);
}

6.指出下面程式碼的問題

- (void)willEndStepOne:(NSObject *)userInfo{    
    [NSThread detachNewThreadSelector:@selector(doSomeThing:) toTarget:self                     
                   withObject:userInfo];
}

- (void)doSomeThing:(NSObject *)userInfo{    
    int max_loop_times = 999999;    
    for (int i=0; i<max_loop_times; i++) {        
        int randNum = rand();        
        NSString *tmpString = [NSString stringWithFormat:@"%d", randNum];                            
        NSLog(@"%@", tmpString);    
    }
}

7.分析json、xml的區別?json、xml解析方式的底層是如何處理的?

http://www.open-open.com/bbs/view/1324367918671
http://hi.baidu.com/fevelen/item/a25253ab76f766756cd455b6

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

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

9.記憶體管理的幾條原則時什麼?按照預設法則.那些關鍵字生成的物件

需要手動釋放?在和property結合的時候怎樣有效的避免記憶體洩露?
誰申請,誰釋放
遵循Cocoa Touch的使用原則;
記憶體管理主要要避免“過早釋放”和“記憶體洩漏”,對於“過早釋放”需要注意@property設定特性時,一定要用對特性關鍵字,對於“記憶體洩漏”,一定要申請了要負責釋放,要細心。
關鍵字alloc 或new 生成的物件需要手動釋放;
設定正確的property屬性,對於retain需要在合適的地方釋放,

10.What is lazy loading?

懶漢模式,只在用到的時候才去初始化。也可以理解成延時載入。我覺得最好也最簡單的一個列子就是tableView中圖片的載入顯示了。一個延時載,避免記憶體過高,一個非同步載入,避免執行緒堵塞