標籤:object-c 面試 ios
這段時間一直忙著面試找工作,面試的過程中暴露出自己一些問題,還是基礎不夠紮實,雖然做了三年IOS開發了,但是僅僅是編碼上和架構上還可以,基礎的東西好多都不知道,太不應該了,所以決心好好把IOS基礎的東西都補一補,下面把面試問的問題羅列一下(共參考)。
1. 為什麼用weak和assgin去修飾delegate? 用strong或者retain 為什麼會引起循環參考?
(1)assgin一般用在非Arc中去修飾delegate,weak是用在Arc中。
(2)weak會在delegate不使用釋放的時候自動化佈建為nil,防止懸垂指標。
(3)如果用strong 或者retain 去修飾delegate 會引起循環參考,原因就是Controller A 中建立的 Controller B 的delegate=A,如果用retain或者strong去修飾的話,A要 釋放的時候,因為B對A有引用,所以A不會被釋放,同理B也不會被釋放,這樣就引起循環參考了。
2. Core Foundation 對象 與 Object- C 對象如何轉化?(用CFStringRef 與NSString來說明)
(1) 在非ARC情況下,兩者只要強制轉化即可,如: CFStringRef str1 = (CFStringRef)str2; (str2為NSString對象)
NSString *str3 = (NSString *)str4; (str4為CFStringRef)
(2) 在ARC情況下,就需要用到__bridge 轉化了,具體為CFStringRef str1 = (__bridgeCFStringRef)str2 (str2為NSString對象), NSString *str3 = (__bridgeNSString*)str4; (str4為CFStringRef),但是__bridge修飾會引起很大的安全性,不能解決管理賦值對象的所有權問題,會引起懸垂指標。
(3)一般用__bridge_retained 和 __bridge_transfer來進行轉化,如:NSString *str2 = (__bridge_transferNSString *)str3; (str3為CFStringRef對象) ; CFStringRef str4 = (__bridge_retainedCFStringRef)str1;(str1為NSString對象),__bridge_transfer被轉化的變數所持有的對象在該變數被賦值給轉化目標變數後隨之釋放了。
(4)__bridge_retained和__bridge_transfer分別可以用CFBridgingRetain和CFBridgingRelease來替代
3. 當遇到記憶體警告的時候會如何處理?
(1)首先分析引起記憶體警告的原因,不外乎有兩種:一種就是存在記憶體泄露引起的,一種就是載入的資源過多。
(2)針對第一種情況就需要用工具去分析記憶體泄露的原因。
(3)針對第一種情況,系統會調用UIApplication::didReceiveMemoryWarning-> UIApplicationDelegate::applicationDidReceiveMemoryWarning,然後調用當前所有的viewController進行處理,以便釋放掉一些資源。
(4)IOS6以前的處理:didReceiveMemoryWarning->viewDidUnload ,在viewDidUnload中釋放資源。
(5)IOS6以後的處理:IOS 6廢棄了viewDidUnload方法,這就意味著一切需要我們自己在didReceiveMemoryWarning中操作。清理一些快取資料 和釋放相應的子View,需要判斷一下view是否是window的一部分,用if(self.isViewLoaded && !self.view.window){self.view = nil};
4. nil, Nil, NSNull 和 NULL分別代表什嗎?在什麼情況下使用
nil:指向一個對象的null 指標
Nil:指向一個類的null 指標
NULL:指向其他類型(如:基本類型、C類型)的null 指標
NSNull:通常表示集合中的空值
5. AutoRelease 修飾的對象,在什麼時候會被釋放?
(1)每個應用程式會建立一個根自動釋放池。
(2)建立的Autorelease對象不再使用的時候,會被最近的釋放池釋放掉,一般在NSRunLoop結束的時候,會釋放自動釋放池中的東西。(對於每一個Runloop, 系統會隱式建立一個Autorelease pool(自然會有多個Autorelease pool),這樣所有的release pool會構成一個象CallStack一樣的一個棧式結構,在每一個Runloop結束時,當前棧頂的Autorelease pool會被銷毀,這樣這個pool裡的每個Object會被release。)
6. autoreleasepool 調用release和drain有什麼不同?
在一個garbage collected環境裡,release不做任何操作。 NSAutoreleasePool因此提供了一個 drain 方法,它在reference-counted環境中的行為和調用release一樣, 但是在一個garbage collected環境中則觸發garbage collection動作.
7. 實現一個NSString 類?
+ (id) stringWithCString: (const char*)nullTerminatedCString encoding: (NSStringEncoding)encoding{ NSString *obj; obj = [self allocWithZone: NSDefaultMallocZone()]; obj = [obj initWithCString: nullTerminatedCString encoding: encoding]; return AUTORELEASE(obj);}
8. int 和 NSInteger 有什麼不同?
NSInteger不用考慮裝置是32位的還是64位的,在32位系統中是int,在64位系統中是long。
9. 如何適配x64位系統,從32位上開發的程式如何升級到64位?
需要注意的問題:
(1). 更新第三方庫,用於支援x64位系統。
(2). 增加arm64的architecture
(3)包含彙編代碼,因為32位架構和64位架構有及其巨大的區別,根本不可能混用代碼,具體情況具體分析
(4)sizeof
(5)指標和整數的互換
(6)int和NSInteger區分,unsigned int和NSUInteger區別,一定用使用NSInteger和NSUInteger
IOS 面試總結