原 iOS面试题收集
原 iOS面試題收集
發(fā)表于2年前(2013-07-22 13:47)?? 閱讀(369)?|?評論(0)?4人收藏此文章,?我要收藏 贊0聽云性能監(jiān)測產(chǎn)品App、Server、CDN免費(fèi)試用,綁定賬號送京東卡
iOS?面試題?Objective-C?
1.ARC 是什么??
ARC 是 iOS 5 推出的新功能,全稱叫 ARC(Automatic Reference Counting)。簡單 地說,就是代碼中自動加入了 retain/release,原先需要手動添加的用來處理內(nèi)存管 理的引用計(jì)數(shù)的代碼可以自動地由編譯器完成了。
該機(jī)能在 iOS 5/ Mac OS X 10.7 開始導(dǎo)入,利用 Xcode4.2 可以使用該機(jī)能。簡單 地理解 ARC,就是通過指定的語法,讓編譯器(LLVM 3.0)在編譯代碼時(shí),自動生成 實(shí)例的引用計(jì)數(shù)管理部分代碼。有一點(diǎn),ARC 并不是 GC,它只是一種代碼靜態(tài)分 析(Static Analyzer)工具。??
?
2.單實(shí)例架構(gòu):只需要一個實(shí)例。
查找文件:
例如:NSFileManager *manager;
manager = [NSFileManager defaultManager];
defaultManager 可以為我們創(chuàng)建一個屬于我們自己的 NSFileManger 對象。?
?
NSString *home = [@"~" stringByExpandingTildeInPath];將~替換成當(dāng)前用戶的主 目錄。?
NSDirectoryEnumerator *direnum = [manager enumeratorAtPath:home];返回一個 NSDictionaryEnumerator,它是 NSEnumerator 的子類。每次在這個枚舉器對象中 調(diào)用 nextObject 時(shí),都會返回該目錄中得一個文件的另一個路徑。??
?
?
3.自動釋放池的銷毀時(shí)間
在我們一直使用的 Foudation 庫工具中,創(chuàng)建和銷毀自動釋放池的方法非常明確: NSAutoreleasePool *pool;
pool = [[NSAutoreleasePool alloc] init];
...
[pool release];?
創(chuàng)建一個自動釋放池時(shí),該池自動成為活動的池。釋放該池時(shí),其保留計(jì)數(shù)器值歸 0 ,然后該池被銷毀。在銷毀的過程中,該池釋放其包含的所有對象。當(dāng)使用 Application Kit 時(shí),cocoa 定期自動為你創(chuàng)建和銷毀自動釋放池。通常是在程序處理 完當(dāng)前事件以后執(zhí)行這些操作。你可以使用任意多得自動釋放對象,當(dāng)不再使用它 們時(shí),自動釋放池將自動為你清理這些對象。?
你可能已經(jīng)在 xcode 自動生成代碼中遇見過另一種銷毀自動釋放池中對象的方式:- drain 方法。該方法只是清空自動釋放池而不是銷毀它。并且只適用于 mac os x10.4 以上的版本。?
4.自動釋放池的工作過程?
我們在任何時(shí)候向一個對象發(fā)送 autorelease 消息,該對象都會唄添加到這個自動釋 放池中。被加入到自動釋放池的對象的引用計(jì)數(shù)器值不會變化。當(dāng)自動釋放池被銷 毀時(shí)(向自動釋放池發(fā)送 release 消息,自動釋放池的引用計(jì)數(shù)器值變?yōu)?0,調(diào)用自身 的 dealloc 函數(shù)),會調(diào)用自身的 dealloc 函數(shù),會向池中得對象發(fā)送 release 消息。??
?
?
5.響應(yīng)者鏈?zhǔn)鞘裁?br />響應(yīng)者鏈?zhǔn)?Application Kit 事件處理架構(gòu)的中心機(jī)制。它由一系列鏈接在一起的響?
應(yīng)者對象組成,事件或者動作消息可以沿著這些對象進(jìn)行傳遞。如圖 6-20 顯示的那 樣,如果一個響應(yīng)者對象不能處理某個事件或動作-也就是說,它不響應(yīng)那個消息 ,或者不認(rèn)識那個事件,則將該消息重新發(fā)送給鏈中的下一個響應(yīng)者。消息沿著響 應(yīng)者鏈向上、向更高級別的對象傳遞,直到最終被處理(如果最終還是沒有被處理 ,就會被拋棄)。?
當(dāng) Application Kit 在應(yīng)用程序中構(gòu)造對象時(shí),會為每個窗口建立響應(yīng)者鏈。響應(yīng)者 鏈中的基本對象是 NSWindow 對象及其視圖層次。在視圖層次中級別較低的視圖將 比級別更高的視圖優(yōu)先獲得處理事件或動作消息的機(jī)會。NSWindow 中保有一個第 一響應(yīng)者的引用,它通常是當(dāng)前窗口中處于選擇狀態(tài)的視圖,窗口通常把響應(yīng)消息 的機(jī)會首先給它。對于事件消息,響應(yīng)者鏈通常以發(fā)生事件的窗口對應(yīng)的 NSWindow 對象作為結(jié)束,雖然其它對象也可以作為下一個響應(yīng)者被加入到 NSWindow 對象的后面。??
?
?
?
7.timer 的間隔周期準(zhǔn)嗎?為什么?怎樣實(shí)現(xiàn)一個精準(zhǔn)的 timer??
NSTimer 可以精確到 50-100 毫秒.?
NSTimer 不是絕對準(zhǔn)確的,而且中間耗時(shí)或阻塞錯過下一個點(diǎn),那么下一個點(diǎn)就 pass?
?
?
過去了??
?
?
8.Difference between shallow copy and deep copy??
淺復(fù)制和深復(fù)制的區(qū)別? 答案:淺層復(fù)制:只復(fù)制指向?qū)ο蟮闹羔?而不復(fù)制引用對象本身。 深層復(fù)制:復(fù)制引用對象本身。
意思就是說我有個 A 對象,復(fù)制一份后得到 A_copy 對象后,對于淺復(fù)制來說,A 和 A_copy 指向的是同一個內(nèi)存資源,復(fù)制的只不過是是一個指針,對象本身資源 還是只有一份,那如果我們對 A_copy 執(zhí)行了修改操作,那么發(fā)現(xiàn) A 引用的對象同樣 被修改,這其實(shí)違背了我們復(fù)制拷貝的一個思想。深復(fù)制就好理解了,內(nèi)存中存在了 兩份獨(dú)立對象本身。
用網(wǎng)上一哥們通俗的話將就是: 淺復(fù)制好比你和你的影子,你完蛋,你的影子也完蛋 深復(fù)制好比你和你的克隆人,你完蛋,你的克隆人還活著。??
?
?
9.Difference between categories and extensions??
類別和類擴(kuò)展的區(qū)別。?
答案:category 和 extensions 的不同在于后者可以添加屬性。另外后者添加的方法?
是必須要實(shí)現(xiàn)的。?
extensions 可以認(rèn)為是一個私有的 Category。??
10.What are KVO and KVC?
答案:kvc:鍵 - 值編碼是一種間接訪問對象的屬性使用字符串來標(biāo)識屬性,而不是通 過調(diào)用存取方法,直接或通過實(shí)例變量訪問的機(jī)制。 很多情況下可以簡化程序代碼。apple 文檔其實(shí)給了一個很好的例子。 kvo:鍵值觀察機(jī)制,他提供了觀察某一屬性變化的方法,極大的簡化了代碼。 具體用看到嗯哼用到過的一個地方是對于按鈕點(diǎn)擊變化狀態(tài)的的監(jiān)控。 比如我自定義的一個 button
[cpp]
[self addObserver:self forKeyPath:@"highlighted" options:0 context:nil];?
#pragma mark KVO?
-
(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(?
NSDictionary *)change context:(void *)context {?
if ([keyPath isEqualToString:@"highlighted"] ) { [self setNeedsDisplay];?
} }?
對于系統(tǒng)是根據(jù) keypath 去取的到相應(yīng)的值發(fā)生改變,理論上來說是和 kvc 機(jī)制的 道理是一樣的。
對于 kvc 機(jī)制如何通過 key 尋找到 value:
“當(dāng)通過 KVC 調(diào)用對象時(shí),比如:[self valueForKey:@”someKey”]時(shí),程序會 自動試圖通過幾種不同的方式解析這個調(diào)用。首先查找對象是否帶有 someKey 這個 方法,如果沒找到,會繼續(xù)查找對象是否帶有 someKey 這個實(shí)例變量(iV ar),如 果還沒有找到,程序會繼續(xù)試圖調(diào)用 -(id) valueForUndefinedKey:這個方法。如果 這個方法還是沒有被實(shí)現(xiàn)的話,程序會拋出一個 NSUndefinedKeyException 異常錯 誤。?
(cocoachina.com 注:Key-V alue Coding 查找方法的時(shí)候,不僅僅會查找 someKey 這個方法,還會查找 getsomeKey 這個方法,前面加一個 get,或者_(dá)someKey 以及 _getsomeKey 這幾種形式。同時(shí),查找實(shí)例變量的時(shí)候也會不僅僅查找 someKey 這 個變量,也會查找_someKey 這個變量是否存在。)?
設(shè)計(jì) valueForUndefinedKey:方法的主要目的是當(dāng)你使用-(id)valueForKey 方法從對 象中請求值時(shí),對象能夠在錯誤發(fā)生前,有最后的機(jī)會響應(yīng)這個請求。這樣做有很 多好處,下面的兩個例子說明了這樣做的好處。“
來至 cocoa,這個說法應(yīng)該挺有道理。?
因?yàn)槲覀冎?button 卻是存在一個 highlighted 實(shí)例變量.因此為何上面我們只是 add 一個相關(guān)的 keypath 就行了,
可以按照 kvc 查找的邏輯理解,就說的過去了。??
11.Difference between frame and bounds??
frame 和 bounds 有什么不同??
答案:frame 指的是:該 view 在父 view 坐標(biāo)系統(tǒng)中的位置和大小。(參照點(diǎn)是父親?
的坐標(biāo)系統(tǒng))?
bounds 指的是:該 view 在本身坐標(biāo)系統(tǒng)中 的位置和大小。(參照點(diǎn)是本身坐標(biāo)系?
?
?
?
12.方法調(diào)度 當(dāng)向一個對象發(fā)送消息時(shí)(調(diào)用方法),這個方法是怎么被調(diào)用的呢?這就依賴于方法?
高度程序,方法調(diào)度程序查找的方法如下:?
在本類的方法中,找被調(diào)用的方法,如果找到了,就調(diào)用,如果找不到被沿著繼承 路徑去查找,從哪個類找到,就調(diào)用哪個類的方法,如果到最根上的類還是沒有找 到,那編譯就會出錯。?
13.繼承與復(fù)合
在 Objective-C 中支持繼承,但只是支持單一繼承(有且只有一個父類有),如果想使 用多繼承的特性,可以使用分類和協(xié)議技術(shù)。?
繼承是 is-a,復(fù)合是 has-a。復(fù)合是通過包含指向?qū)ο蟮闹羔槍?shí)現(xiàn)的,嚴(yán)格意義上講, 復(fù)合是針對于對象間來說,對于基本數(shù)據(jù)類型來說,它們被認(rèn)為是對象的一部分。?
14.裝箱與拆箱
由于 NSArray,NSDirectory 等類不能直接存儲基本數(shù)據(jù)類型,所以要想在 NSArray?
\NSDirectory 中使用基本數(shù)據(jù)類型,就得使用裝箱與拆箱。?
在 Objective-C 中,可以使用 NSNumber 和 NSValue 來實(shí)現(xiàn)對數(shù)據(jù)類型的包裝, NSNumber 可以實(shí)現(xiàn)對基本數(shù)據(jù)類型的包裝,NSV alue 可以實(shí)現(xiàn)對任意類型數(shù)據(jù)的 包裝。?
將基本類型封裝成對象叫裝箱,從封裝的對象中提取基本類型叫拆箱(取消裝箱),其 它語言如 Java 原生支持裝箱與拆箱,Ojbective-C 不支持自動裝箱與拆箱,如果需 要得需要自己來實(shí)現(xiàn)裝箱與拆箱。?
15.便利初始化?
當(dāng)一個類需要根據(jù)不同的情況來初始化數(shù)據(jù)成員時(shí),就需要便利初始化函數(shù),與 init 初始化不同的是,便利初始化函數(shù)有參數(shù),參數(shù)個數(shù)可以有 1 到N個,N是類數(shù)據(jù) 成員個數(shù)。?
指定初始化函數(shù):什么是指定初始化函數(shù)?在類中,某個初始化函數(shù)會被指定為指 定的初始化函數(shù),確定指定初始化函數(shù)的規(guī)則是初始化函數(shù)中,參數(shù)最多的為指定 初始化函數(shù),?
其它未被指定為指定初始化函數(shù)的初始化函數(shù)要調(diào)用指定初始化函數(shù)來實(shí)現(xiàn)。對于 該類的子類也是一樣,只要重寫或者直接使用父類的指定初始化函數(shù)。上述文字有 些繞,來個例子吧?
@interface?A{?
int x; int y; }?
-(id) init;
-(id) initWithX:(int) xValue; -(id) initWithY:(int) yValue; -(id) initWithXY:(int) xValue?
yVal:(int) yValue;?
@end
這里 initWithXY 被確定為指定初始化函數(shù)。 -(id) initWithXY:(int) xValue
yVal:(int) yValue{?
if (self = [super init]){ x = xValue;
y = yValue;
}?
return self; }?
-(id) init{
if (self = self initWithXY:10 yVal:20){
}
return self;
}
.......?
@interface?B: A{?
int z;?
}?
-(jd) initWithXY......;?
@end
@implementation B?
-(id) initWithXY:(int) xValue yVal:(int) yValue{?
if (self = [super initWithXY:10 yVal=20]){
z= 40;
}?
return self; }
@end??
?
?
?
?
?
16.cocoa
cocoa 實(shí)際上是由 2 個不同的框架組成的:Foundation Kit 和 Application Kit。?
Application Kit 包含了所有的用戶接口對象和高級類。??
?
17.NSRange
typedef struct _NSRange { unsigned int location; unsigned int length; }NSRange;?
這個結(jié)構(gòu)體用來表示相關(guān)事務(wù)的范圍,通常是字符串里的字符范圍或者數(shù)組里的元 素范圍。??
18.三種賦值方式
1.NSRange range;
range.location = 17;
range.length = 4;
2.C 語言的聚合結(jié)構(gòu)賦值機(jī)制
NSRange range = {17, 4};
3.Cocoa 提供的一個快捷函數(shù) NSMakeRange() NSRange range = NSMakeRange(17, 4);?
使用 NSMakeRange()的好處是你可以在任何能夠使用函數(shù)的地方使用它,例如在方 法調(diào)用中將其當(dāng)成參數(shù)傳遞。??
19.幾何數(shù)據(jù)類型
1.NSPoint 代表笛卡兒平面中得一個點(diǎn)(x, y).?
typedef struct _NSPoint { float x;
float y;
}NSPoint;?
2.NSSize 用來存儲長度和寬度 typedef struct NSSize {
float width;
float height;?
}NSSize;?
3.NSRect 矩形數(shù)據(jù)類型,它是由點(diǎn)和大小復(fù)合而成 typedef struct _NSRect {
NSPoint origin;??
?
?
20.字符串 NSString stringWithFormat:就是一個工廠方法,它根據(jù)你提供的參數(shù)創(chuàng)建新對象。 length:長度
isEqualToString:比較字符串內(nèi)容是否相同 compart:將接受對象和傳遞來的字符串逐個字符的進(jìn)行比較。返回一個 enum 數(shù)據(jù) NSCaseInsensitiveSearch:不區(qū)分大小寫字符。 NSLiteralSearch:進(jìn)行完全比較,區(qū)分大小寫 NSNumericSearch:比較字符串的字符個數(shù),而不是字符值。 -(NSRange)rangeOfString:(NSString *)aString;
返回的 range.start 為開始位置,range.length 為長度。??
?
21.NSMutableString 可變字符串。 stringWithCapacity:創(chuàng)建一個新的 NSMutableString?
字符串的大小并不僅限于所提供的容量,這個容量僅是個最優(yōu)值。如果要創(chuàng)建一個 40mb 的字符串。?
NSMutableString *str = [NSMutableString stringWithCapacity:42]; appendString 接受參數(shù) aString,然后將其復(fù)制到接收對象的末尾。?
appendFormat 與 stringWithFormat:類似,但它將格式化的字符串附加在接收字符 串的末尾,而不是創(chuàng)建新的字符串對象。??
22.集合家族
1.NSArray:是一個 Cocoa 類,用來存儲對象的有序列表。 兩個限制:1.只能存儲 objective-c 的對象,不能存儲 C 語言中得基本數(shù)據(jù)類型。?
?
23.NSNumber 包裝(以對象形式實(shí)現(xiàn))基本數(shù)據(jù)類型 裝箱:將一個基本類型的數(shù)據(jù)包裝成對象。 取消裝箱:從對象中提取基本類型的數(shù)據(jù)。 objective-c 不支持自動裝箱。??
?
?
?
?
?
?
?
24.NSV alue 是 NSNumber 的父類。?
+(NSValue *)valueWithBytes:(const void *)value objCType:(const char *)type;?
傳遞的參數(shù)是你想要包裝的數(shù)值的地址(如一個 NSSize 或你自己的 struct)。通常, 得到的是你想要存儲的變量的地址(在 C 語言中使用操作符&)。你也可以提供一 個用來描述這個數(shù)據(jù)類型的字符串,通常用來說明 struct 中實(shí)體的類型和大小。你 不用自己寫代碼來生成這個字符串,@encode?編譯器指令可以接受數(shù)據(jù)類型的名稱 并為你生成合適的字符串。?
NSRect rect = NSMakeRect(1, 2, 30, 40);
NSValue *value;
value = [NSValue valueWithBytes:&rect objCType:@encode(NSRect)]; [array addObject:value];??
25.NSNull 只有一個方法[NSNull null];
[NSNull null]總是返回一樣的數(shù)值,所以你可以使用運(yùn)算符==將該值與其他值進(jìn)行?
比較??
?
?
?
?
?
?
分享到:??0贊 聲明:OSCHINA 博客文章版權(quán)屬于作者,受法律保護(hù)。未經(jīng)作者同意不得轉(zhuǎn)載。- ? 上一篇
- 下一篇 ?
轉(zhuǎn)載于:https://www.cnblogs.com/iOS-mt/p/4260748.html
總結(jié)
以上是生活随笔為你收集整理的原 iOS面试题收集的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [整理]zepto的初次使用
- 下一篇: 大熊君学习html5系列之------H