iOS之各種區別

2021-08-01 08:47:45 字數 2802 閱讀 4112

關注2017.05.15 10:47*

字數 140

閱讀 1273

喜歡 51

寫在前面:本文持續更新,也歡迎簡友提供更多的關於ios(包括swift)中的區別

1. _ _block和 _ _weak修飾符的區別的:

(1). _ _block不管是arc還是mrc模式下都可以使用,可以修飾物件,還可以修飾基本資料型別。 

(2). _ _weak只能在arc模式下使用,也只能修飾物件(nsstring),不能修飾基本資料型別(int)。

(3). _ _block物件可以在block中被重新賦值, _ _weak不可以。

注: 變數物件在block中是唯讀的,前面用_ _block修飾是為了讓block是複製其引用位址來實現對外界變數的訪問。

2.assign和weak有什麼區別
一 、區別

(1).修飾變數型別的區別 weak只可以修飾物件。如果修飾基本資料型別,編譯器會報錯-「property with 『weak』 attribute must be of object type」。assign 可修飾物件,和基本資料型別。當需要修飾物件型別時,mrc時代使用unsafe_unretained。當然,unsafe_unretained也可能產生野指標,所以它名字是"unsafe_」。

(2).是否產生野指標的區別 weak不會產生野指標問題。因為weak修飾的物件釋放後(引用計數器值為0),指標會自動被置nil,之後再向該物件發訊息也不會崩潰。 weak是安全的。assign 如果修飾物件,會產生野指標問題;如果修飾基本資料型別則是安全的。修飾的物件釋放後,指標不會自動被置空,此時向物件發訊息會崩潰。

二、相似

都可以修飾物件型別,但是assign修飾物件會存在問題

三、總結

assign 適用於基本資料型別如int,float,struct等值型別,不適用於引用型別。因為值型別會被放入棧中,遵循先進後出原則,由系統負責管理棧記憶體。而引用型別會被放入堆中,需要我們自己手動管理記憶體或通過arc管理。weak 適用於delegate和block等引用型別,不會導致野指標問題,也不會迴圈引用,非常安全。當然怎麼選擇使用assign還是weak,mrc的話只能用assign,在arc的情況下最好使用weak,因為weak修飾的變數在釋放後自動指向nil,防止野指標存在。

3. copy與retain(strong)的區別

謝謝簡友 追善的指出, 此條之前的說法的確不夠嚴謹,吾正在詳細創造中... 下面先放個圖

copy修飾的可變與不可變.png

4.assign和retain的區別

assign就是直接賦值,從而可能引起1中的問題,當資料為int, float等原生型別時,可以使用assign。retain就如2中所述,

使用了引用計數,retain引起引用計數加1, release引起引用計數減1,當引用計數為0時,dealloc函式被呼叫,記憶體被**。

5. extension和category的區別
extension看起來很像乙個匿名的category,但是extension和有名字的category幾乎完全是兩個東西。 

extension在編譯期決議,它就是類的一部分,在編譯期和標頭檔案裡的@inte***ce以及實現檔案裡的@implement一起形成乙個完整的類,它伴隨類的產生而產生,亦隨之一起消亡。extension一般用來隱藏類的私有資訊,你必須有乙個類的原始碼才能為乙個類新增extension,所以你無法為系統的模擬如nsstring新增extension。

但是category則完全不一樣,它是在執行期決議的。就category和extension的區別來看,我們可以推導出乙個明顯的事實,extension可以新增例項變數,而category是無法新增例項變數的(因為在執行期,物件的記憶體布局已經確定,如果新增例項變數就會破壞類的內部布局,這對編譯型語言來說是災難性的)。

6. const和巨集(define)的區別
1.define在預處理階段進行替換,const常量在編譯階段使用

2.define不做型別檢查,僅僅進行替換,const常量有資料型別,會執行型別檢查

3.define不能除錯,const常量可以除錯

4.define定義的常量在替換後執行過程中,會不斷地占用記憶體,而const定義的常量儲存在資料段,只有乙份copy,效率更高。

5.define可以定義一些簡單的函式和方法,而const不能

7. id 和 instancetype 的區別
1.  instancetype 和 id 都是萬能指標,指向物件。 

2. 不同點:

id在編譯的時候不能判斷物件的真實型別,instancetype在編譯的時候可以判斷物件的真實型別

id可以用來定義變數,可以作為返回值型別,可以作為形參型別;instancetype只能作為返回值型別

3. 注意:以後凡是自定義構造方法,返回值型別盡量使用instancetype,不要使用id

8.struct和class的區別
struct是值引用 深拷貝,不可繼承,swift更加推薦使用struct。

class是類引用 淺拷貝 可繼承

to be continued...

iOS 各種報錯,各種error

是因為修改了標頭檔案,新增了空格啊什麼的 llvm low level virtual machine 低階編譯器 需要把note 後面提示要刪的指定的路徑檔案在finder中找到並完全刪除 如果是真的修改了system header 那麼解決的方法 1 還原 2 重灌xcode 關於xib連線的三...

IOS各種動畫

1。html view plain copy uibezierpath movepath uibezierpath bezierpath movepath movetopoint center movepath addquadcurvetopoint topos controlpoint cgpoi...

各種ios語法

property nonatomic,strong a1 synthesize a1 的用法 一般在別的類如a2中使用 類a.a1屬性 self.a1 的時候才用到,a.m中可以不用 但self.a1除外 直接對a1進行賦值操作 true和false true和false yes和no 1和0都是一...