2二、iOS面試題·自整理·Four

1.爲何代理要用weak?代理的delegate和dataSource有什麼區別?block和代理的區別?

A:爲了不循環引用。weak指明該對象並不負責保持delegate這個對象,delegate這個對象的銷燬由外部控制。strong該對象強引用delegate,外界不能銷燬delegate對象,會致使循環引用。DataSource是關於View的內容的東西包括屬性,數據等等,而Delegate則是一些咱們能夠調用的方法,全是操做。block和代理都能解決對象間交互的問題,block更輕型,更簡單,可以直接訪問上下文,代碼一般在同一個地方,這樣讀代碼也連貫。缺點是容易引發循環引用。delegate更重一些,須要實現接口,它的方法分開來,不少時候須要存儲一些臨時數據,另外相關的代碼須要分離到各處沒有block好讀,其優勢就是它是用weak關鍵字修飾的,不會引發循環引用。緩存

2.屬性的實質是什麼?包括哪幾個部分?屬性默認的關鍵字都有哪些?@dynamic關鍵字和@synthesize關鍵字是用來作什麼的?

A:屬性的本質是@property = ivar+getter+setter,也就是說@property系統會自動生成getter和setter方法。屬性默認的關鍵字包括atomic,nonatomic,@synthesize,@dynamic,getter=getterName,setter=setterName,readwrite,readonly,assign,retain,copy。
@dynamic:表示變量對應的屬性訪問器方法,是動態實現的,你須要在 NSObject 中繼承而來的 +(BOOL) resolveInstanceMethod:(SEL) sel 方法中指定 動態實現的方法或者函數。
@synthesize:若是沒有實現setter和getter,編譯器可以自動實現getter和setter方法。安全

3.NSString爲何要用copy關鍵字,若是用strong會有什麼問題?(注意:這裏沒有說用strong就必定不行。使用copy和strong是看狀況而定的)

A:針對於當把NSMutableString賦值給NSString的時候,纔會有不一樣,用copy的話NSString的值不會發生變化,用strong則會發生變化,隨着NSMutableString的值變化。若是是賦值是NSString對象,那麼使用copy仍是strong,結果都是同樣的,由於NSString對象根本就不能改變自身的值,他是不可變的。併發

4.如何令本身所寫的對象具備拷貝功能?

A:若想讓本身寫的對象具備拷貝功能,則須要實現NSCopying協議。若是自定義的對象分爲可變版本和非可變版本,那麼就要同時實現NSCopying和NSMutableCopying協議,不過通常沒什麼必要,實現NSCopying協議就夠了。app

5.可變集合類 和 不可變集合類的 copy 和 mutablecopy有什麼區別?若是是集合是內容複製的話,集合裏面的元素也是內容複製麼?

A:對於不可變對象,copy操做是淺複製,mutableCopy是深複製。對於不可變對象,mutableCopy不只僅是深複製,返回的對象類型仍是不可變對象類型相應的可變對象的類型。內容複製也就是深拷貝,集合的深複製有兩個方法,能夠用initWithArray:copyItems:將第二個參數設置爲YES便可進行深複製,如:NSDictionary shallowCopyDict = [NSDictionary alloc]initWithDictionary:someDictionary copyItems:YES];若是用這個方法深複製,集合裏的每一個元素都會收到copyWithZone:消息。若是集合裏的對象遵循NSCopying協議,那麼對象就會深複製到新的集合。若是對象沒有遵循NSCopying協議,而嘗試用這種方法進行深複製則會出錯。copyWithZone:這種拷貝方式只能提供一層內存拷貝,而非真正的深拷貝。第二種方法是將集合進行歸檔解檔,如:NSArray trueDeepCopyArray = [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:oldArray]];異步

6.爲何IBOutlet修飾的UIView也適用weak關鍵字?

A:由於既然有外鏈那麼視圖在xib或者storyboard中確定存在,視圖已經對它有一個強引用了。async

7. nonatomic和atomic的區別?atomic是絕對的線程安全麼?爲何?若是不是,那應該如何實現?

A:nonatomic和atomic的區別在於二者自動生成getter和setter的方法不同,若是你本身寫getter和setter方法,那麼(getter,setter,retain,copy,assign)只起提示做用,寫不寫都同樣。
對於atomic的屬性,系統生成的getter和setter會保證get,set的操做完整性,不受其餘線程影響。好比線程A的getter方法運行到一半,線程B調用了setter,那麼線程A的getter仍是能獲得一個完整的對象。
而nonatomic就沒有這個保證了,因此速度要比atomic快。
不過atomic可不能保證線程安全,若是線程A調用了getter,與此同時線程B和線程C都調了setter,那最後線程Aget到的值,三種都有可能:多是B,C set以前原始的值,也多是B set的值,也多是C set的值。同時這個最終的值,也多是B set的值,也多是C set的值。要保證安全,可使用線程鎖。函數

8.UICollectionView自定義layout如何實現?

A:UICollectionViewLayoutAttributes,UICollectionViewFlowLayout。oop

9.用StoryBoard開發界面有什麼弊端?如何避免?

A:難以維護,若是須要改動全局的一個字體,若是是代碼的話就很好辦,pch或頭文件中改動就行了。若是是storyboard中就須要一個一個改動很麻煩。
若是storyboard中scene太多,打開storyboard會比較慢。
錯誤定位比較困難,好多錯誤提示模棱兩可。字體

10.進程和線程的區別?同步異步的區別?並行和併發的區別?

A:進程是一個內存中運行的應用程序,好比在Windows系統中,一個運行的exe就是一個進程。
線程是指進程中的一個執行流程。
同步是順序執行,執行完一個再執行下一個。須要等待,協調運行。
異步就是彼此獨立,在等待某事件的過程當中繼續作本身的事,不須要等待這些事件完成後再工做。
並行和併發 是前者至關於三我的同時吃一個饅頭,後者至關於一我的同時吃三個饅頭。
併發性(Concurrence):指兩個或兩個以上的事件或活動在同一時間間隔內發生。併發的實質是一個物理CPU(也能夠多個物理CPU) 在若干道程序之間多路複用,併發性是對有限物理資源強制行使多用戶共享以提升效率。
並行性(parallelism)指兩個或兩個以上事件或活動在同一時刻發生。在多道程序環境下,並行性使多個程序同一時刻可在不一樣CPU上同時執行。
區別:(併發)一個處理器同時處理多個任務和(並行)多個處理器或者是多核的處理器同時處理多個不一樣的任務。atom

11.線程間通訊?

A:NSThread、GCD、NSOperation。

12.GCD的一些經常使用的函數?(group,barrier,信號量,線程同步)

A:1.延遲執行任務函數:dispatch_after(.....)。
2.一次性執行dispatch_once(...)。
3.柵欄函數dispatch_barrier_async/dispatch_barrier_sync。
4.隊列組的使用dispatch_group_t。
5.GCD定時器。

13.如何使用隊列來避免資源搶奪?

A:dispatch_barrior_async 做用是在並行隊列中,等待前面兩個操做並行操做完成。

14.數據持久化的幾個方案(fmdb用沒用過)

A:Coredata,realm,fmdb。

15.說一下AppDelegate的幾個方法?從後臺到前臺調用了哪些方法?第一次啓動調用了哪些方法?從前臺到後臺調用了哪些方法?

A:
1.當程序第一次運行而且將要顯示窗口的時候執行,在該方法中咱們完成的操做

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

2.程序進入後臺的時候首先執行程序將要取消活躍該方法

- (void)applicationWillResignActive:(UIApplication *)application

3.該方法當應用程序進入後臺的時候調用

- (void)applicationDidEnterBackground:(UIApplication *)application

4.當程序進入將要前臺的時候調用

- (void)applicationWillEnterForeground:(UIApplication *)application

5.應用程序已經變得活躍(應用程序的運行狀態)

- (void)applicationDidBecomeActive:(UIApplication *)application

6.當程序將要退出的時候調用,若是應用程序支持後臺運行,該方法被applicationDidEnterBackground:替換

- (void)applicationWillTerminate:(UIApplication *)application

16.NSCache優於NSDictionary的幾點?

A:NSCache 是一個容器類,相似於NSDIctionary,經過key-value 形式存儲和查詢值,用於臨時存儲對象。
注意一點它和NSDictionary區別就是,NSCache 中的key沒必要實現copy,NSDictionary中的key必須實現copy。
NSCache中存儲的對象也沒必要實現NSCoding協議,由於畢竟是臨時存儲,相似於內存緩存,程序退出後就被釋放了。

17.知不知道Designated Initializer(指定初始化函數)?使用它的時候有什麼須要注意的問題?

A:好比:

- (instancetype)initWithNibName:(nullable NSString *)nibNameOrNil bundle:(nullable NSBundle *)nibBundleOrNil NS_DESIGNATED_INITIALIZER; - (nullable instancetype)initWithCoder:(NSCoder *)aDecoder NS_DESIGNATED_INITIALIZER;

18.實現description方法能取到什麼效果?

A:1.NSLog(@"%@", objectA);這會自動調用objectA的description方法來輸出ObjectA的描述信息.
2.description方法默認返回對象的描述信息(默認實現是返回類名和對象的內存地址)
3.description方法是基類NSObject 所帶的方法,由於其默認實現是返回類名和對象的內存地址, 這樣的話,使用NSLog輸出OC對象,意義就不是很大,由於咱們並不關心對象的內存地址,比較關心的是對象內部的一些成變量的值。所以,會常常重寫description方法,覆蓋description方法的默認實現。

19.objc使用什麼機制管理對象內存?

A:經過 retainCount 的機制來決定對象是否須要釋放。 每次 runloop 的時候,都會檢查對象的 retainCount,若是retainCount 爲 0,說明該對象沒有地方須要繼續使用了,能夠釋放掉了。

20.block的實質是什麼?一共有幾種block?都是什麼狀況下生成的?

A:block對象就是一個結構體,裏面有isa指針指向本身的類(global malloc stack),有desc結構體描述block的信息,forwarding指向本身或堆上本身的地址,若是block對象截獲變量,這些變量也會出如今block結構體中。最重要的block結構體有一個函數指針,指向block代碼塊。block結構體的構造函數的參數,包括函數指針,描述block的結構體,自動截獲的變量(全局變量不用截獲),引用到的block變量。(block對象也會轉變成結構體)block代碼塊在編譯的時候會生成一個函數,函數第一個參數是前面說到的block對象結構體指針。執行block,至關於執行block裏面forwarding裏面的函數指針。

相關文章
相關標籤/搜索