1. 程式人生 > >u012546545的專欄

u012546545的專欄

技術

基礎

1.為什麼說Objective-C是一門動態的語言?

   什麼叫動態靜態

     靜態、動態是相對的,這裡動態語言指的是不需要在編譯時確定所有的東西,在執行時還可以動態的新增變數、方法和類

     Objective-C 可以通過Runtime 這個執行時機制,在執行時動態的新增變數、方法、類等,所以說Objective-C 是一門動態的語言

   其他說法

     Objective-C 是C 的超集,在C 語言的基礎上添加了面向物件特性,並且利用Runtime 這個執行時機制,為Objective-C 增添了動態的特性。

    Objective-C 使用的是 “訊息結構” 並非 “函式呼叫”:使用訊息結構的的語言,其執行時所應執行的程式碼由執行期決定;而使用函式呼叫的語言,則由編譯器決定

  (1)動態型別語言:動態型別語言是指在執行期間才去做資料型別檢查的語言,也就是說,在用動態型別的語言程式設計時,永遠也不用給任何變數指定資料型別,該語言會在你第一次賦值給變數時,在內部將資料型別記錄下來。Python和Ruby就是一種典型的動態型別語言,其他的各種指令碼語言如VBScript也多少屬於動態型別語言。

   (2)靜態型別語言:靜態型別語言與動態型別語言剛好相反,它的資料型別是在編譯其間檢查的,也就是說在寫程式時要宣告所有變數的資料型別,C/C++是靜態型別語言的典型代表,其他的靜態型別語言還有C#、JAVA等。

因為在執行期可以繼續向類中新增方法,所以編譯器在編譯時還無法確定類中是否有某個方法的實現。對於類無法處理一個訊息就會觸發訊息轉發機制

訊息轉發分為兩大階段:

“動態方法解析”:先徵詢接收者,所屬的類,能否動態新增方法,來處理這個訊息,若可以則結束,如不能則繼續往下走 “完整的訊息轉發機制”: 請接收者看看有沒其他物件能處理這條訊息,若有,就把這個訊息轉發給那個物件然後結束 執行時系統會把與訊息有關細節全部封裝到NSInvocation 物件中,再給物件最後一次機會,令其設法解決當前還未處理的這條訊息

Objective-c的動態性

Objective-C的動態性,讓程式在執行時判斷其該有的行為,而不是像c等靜態語言在編譯構建時就確定下來。它的動態性主要體現在3個方面:

  • 1.動態型別:如id型別。實際上靜態型別因為其固定性和可預知性而使用的特別廣泛。靜態型別是強型別,動態型別是弱型別,執行時決定接收者。
  • 2.動態繫結:讓程式碼在執行時判斷需要呼叫什麼方法,而不是在編譯時。與其他面嚮物件語言一樣,方法呼叫和程式碼並沒有在編譯時連線在一起,而是在訊息傳送時才進行連線。執行時決定呼叫哪個方法。
  • 3.動態載入。讓程式在執行時新增程式碼模組以及其他資源。使用者可以根據需要執行一些可執行程式碼和資源,而不是在啟動時就載入所有元件。可執行程式碼中可以含有和程式執行時整合的新類

 2.講一下MVC和MVVM,MVP?

 3.為什麼代理要用weak?代理的delegate和dataSource有什麼區別?block和代理的區別?

  1. 為什麼代理要用weak?  防止迴圈引用。例如View有一個協議,需要一個代理實現回撥。一個Controller新增這個View,並且遵守協議,成為View的代理。如果不用week,用strong,Controller ->View -> delegate -> Controller,就迴圈引用了。
  2. 代理的delegate和dataSource有什麼區別? delegate偏重於與使用者互動的回撥,有那些方法可以供我使用,例如UITableviewDelegate;dataSource偏重於資料的回撥,view裡面有什麼東西,屬性都是什麼,例如UITableviewDatasource;

 4.屬性的實質是什麼?包括哪幾個部分?屬性預設的關鍵字都有哪些?@dynamic關鍵字和@synthesize關鍵字是用來做什麼的?

屬性的實質

       @property = ivar + getter + setter;   利用class_copyPropertyList 檢視類的所有屬性   利用class_copyIvarList檢視類的所有成員變數   利用class_copyMethodList檢視類的所有方法

@dynamic告訴編譯器,屬性的setter與getter方法由使用者自己實現。

@synthesize的語義是如果你沒有手動實現setter方法和getter方法,那麼編譯器會自動為你加上這兩個方法。

 5.屬性的預設關鍵字是什麼?

 6.NSString為什麼要用copy關鍵字,如果用strong會有什麼問題?(注意:這裡沒有說用strong就一定不行。使用copy和strong是看情況而定的)

  • NSString、NSArray、NSDictionary 等等經常使用 copy 關鍵字,是因為他們有對應的可變型別:NSMutableString、NSMutableArray、NSMutableDictionary. 為確保物件中的屬性值不會無意間變動,應該在設定新屬性值時拷貝一份,保護其封裝性block,也經常使用 copy,關鍵字block。

  • 使用 copy 是從 MRC 遺留下來的“傳統”,在 MRC 中,方法內部的 block 是在棧區的,使用 copy 可以把它放到堆區. 在 ARC 中寫不寫都行:對於 block 使用 copy 還是 strong 效果是一樣的,但是建議寫上 copy,因為這樣顯示告知呼叫者“編譯器會自動對 block 進行了 copy 操作

 7.如何令自己所寫的物件具有拷貝功能?

若想令自己所寫的物件具有拷貝功能,則需實現 NSCopying 協議。如果自定義的物件分為可變版本與不可變版本,那麼就要同時實現 NSCopying與 NSMutableCopying協議。

具體步驟:

  • 需宣告該類遵從 NSCopying 協議
  • 實現 NSCopying 協議。該協議只有一個方法:
 - (id)copyWithZone:(NSZone *)zone;

注意:一提到讓自己的類用 copy 修飾符,我們總是想覆寫copy方法,其實真正需要實現的卻是 “copyWithZone” 方法。

至於如何重寫帶 copy 關鍵字的 setter這個問題, 如果拋開本例來回答的話,如下:

- (void)setName:(NSString *)name {
    //[_name release];
    _name = [name copy];
}

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

使用copy時 可變集合的指標地址以及記憶體地址都不相同  深複製  不可變集合的指標地址不一樣但是記憶體地址一樣 屬於淺複製

使用mutableCopy的時候無論是可變集合還是不可變集合的指標地址和記憶體地址都不同 都屬於深複製

 9.為什麼IBOutlet修飾的UIView也適用weak關鍵字?

      當我們將控制元件拖到storyboard或者xib上時,就相當於是建立了一個物件,而這個物件是加到了試圖控制器的view上,也就是存放到了subviews陣列中。也就是說我們的控制元件物件是屬於view 的,view 對其子控制元件的關係是強引用。 所以當我們使用Outlet屬性的時候,這個Outlet屬性是有view來進行強引用的。我們是在viewController中僅僅使用了它,沒有必要擁有它,所以使用weak進行修飾。 PS:用strong也是可以的。

 10.nonatomic和atomic的區別?atomic是絕對的執行緒安全麼?為什麼?如果不是,那應該如何實現?

atomic 和 nonatomic 的區別在於,系統自動生成的 getter/setter 方法不一樣。如果你自己寫 getter/setter,那 atomic/nonatomic/retain/assign/copy 這些關鍵字只起提示作用,寫不寫都一樣。

對於atomic的屬性,系統生成的 getter/setter 會保證 get、set 操作的完整性,不受其他執行緒影響。比如,執行緒 A 的 getter 方法執行到一半,執行緒 B 呼叫了 setter:那麼執行緒 A 的 getter 還是能得到一個完好無損的物件。

nonatomic就沒有這個保證了。所以,nonatomic的速度要比atomic快。

不過atomic可並不能保證執行緒安全。如果執行緒 A 調了 getter,與此同時執行緒 B 、執行緒 C 都調了 setter——那最後執行緒 A get 到的值,3種都有可能:可能是 B、C set 之前原始的值,也可能是 B set 的值,也可能是 C set 的值。同時,最終這個屬性的值,可能是 B set 的值,也有可能是 C set 的值。

--------------------- 作者:bowei-iOS 來源:CSDN 原文:https://blog.csdn.net/bowei1105/article/details/73320994?utm_source=copy 版權宣告:本文為博主原創文章,轉載請附上博文連結!

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

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

 13.程序和執行緒的區別?同步非同步的區別?並行和併發的區別?

 14.執行緒間通訊?

 15.GCD的一些常用的函式?(group,barrier,訊號量,執行緒同步)

 16.如何使用佇列來避免資源搶奪?

 17.資料持久化的幾個方案(fmdb用沒用過)

 18.說一下AppDelegate的幾個方法?從後臺到前臺呼叫了哪些方法?第一次啟動呼叫了哪些方法?從前臺到後臺呼叫了哪些方法?

 19.NSCache優於NSDictionary的幾點?

 20.知不知道Designated Initializer?使用它的時候有什麼需要注意的問題?

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

 22.objc使用什麼機制管理物件記憶體?

中級

Block

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

    2.為什麼在預設情況下無法修改被block捕獲的變數? __block都做了什麼?

    3.模擬一下迴圈引用的一個情況?block實現介面反向傳值如何實現?

Runtime

    1.objc在向一個物件傳送訊息時,發生了什麼?

    2.什麼時候會報unrecognized selector錯誤?iOS有哪些機制來避免走到這一步?

    3.能否向編譯後得到的類中增加例項變數?能否向執行時建立的類中新增例項變數?為什麼?

    4.runtime如何實現weak變數的自動置nil?

    5.給類新增一個屬性後,在類結構體裡哪些元素會發生變化?

RunLoop

    1.runloop是來做什麼的?runloop和執行緒有什麼關係?主執行緒預設開啟了runloop麼?子執行緒呢?

    2.runloop的mode是用來做什麼的?有幾種mode?

    3.為什麼把NSTimer物件以NSDefaultRunLoopMode(kCFRunLoopDefaultMode)新增到主執行迴圈以後,滑動scrollview的時候NSTimer卻不動了?

    4.蘋果是如何實現Autorelease Pool的?

類結構

    1.isa指標?(物件的isa,類物件的isa,元類的isa都要說)

    2.類方法和例項方法有什麼區別?

    3.介紹一下分類,能用分類做什麼?內部是如何實現的?它為什麼會覆蓋掉原來的方法?

    4.執行時能增加成員變數麼?能增加屬性麼?如果能,如何增加?如果不能,為什麼?

    5.objc中向一個nil物件傳送訊息將會發生什麼?(返回值是物件,是標量,結構體)

高階

    1.UITableview的優化方法(快取高度,非同步繪製,減少層級,hide,避免離屏渲染)

    2.有沒有用過執行時,用它都能做什麼?(交換方法,建立類,給新建立的類增加方法,改變isa指標)

    3.看過哪些第三方框架的原始碼?都是如何實現的?(如果沒有,問一下多圖下載的設計)

    4.SDWebImage的快取策略?

    5.AFN為什麼新增一條常駐執行緒?

    6.KVO的使用?實現原理?(為什麼要建立子類來實現)

    7.KVC的使用?實現原理?(KVC拿到key以後,是如何賦值的?知不知道集合操作符,能不能訪問私有屬性,能不能直接訪問_ivar)