22、iOS面試題·自整理·Four

來源:互聯網
上載者:User

標籤:isa   pre   init   淺複製   代理   out   外鏈   其他   訊號   

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協議就夠了。

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中肯定存在,視圖已經對它有一個強引用了。

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。

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

A:難以維護,如果需要改動全域的一個字型,如果是代碼的話就很好辦,pch或標頭檔中改動就好了。如果是storyboard中就需要一個一個改動很麻煩。
如果storyboard中scene太多,開啟storyboard會比較慢。
錯誤定位比較困難,好多錯誤提示模稜兩可。

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

A:進程是一個記憶體中啟動並執行應用程式,比如在Windows系統中,一個啟動並執行exe就是一個進程。
線程是指進程中的一個執行流程。
同步是順序執行,執行完一個再執行下一個。需要等待,協調運行。
非同步就是彼此獨立,在等待某事件的過程中繼續做自己的事,不需要等待這些事件完成後再工作。
並行和並發 是前者相當於三個人同時吃一個饅頭,後者相當於一個人同時吃三個饅頭。
並發性(Concurrence):指兩個或兩個以上的事件或活動在同一時間間隔內發生。並發的實質是一個物理CPU(也可以多個物理CPU) 在若干道程式之間多工,並發性是對有限實體資源強制行使多使用者共用以提高效率。
並行性(parallelism)指兩個或兩個以上事件或活動在同一時刻發生。在多道程式環境下,並行性使多個程式同一時刻可在不同CPU上同時執行。
區別:(並發)一個處理器同時處理多個任務和(並行)多個處理器或者是多核的處理器同時處理多個不同的任務。

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裡面的函數指標。

22、iOS面試題·自整理·Four

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.