①類別中原則上只能增加方法(能新增屬性的的原因只是通過runtime能新增屬性的的原因只是通過runtime的objc_setassociatedobject和objc_getassociatedobject方法解決無setter/getter的問題而已);
②類擴充套件不僅可以增加方法,還可以增加例項變數(或者屬性),只是該例項變數預設是@private型別的(
用範圍只能在自身類,而不是子類或其他地方);
③類擴充套件中宣告的方法沒被實現,編譯器會報警,但是類別中的方法沒被實現編譯器是不會有任何警告的。這是因為類擴充套件是在編譯階段被新增到類中,而類別是在執行時新增到類中。
④類擴充套件不能像類別那樣擁有獨立的實現部分(@implementation部分),也就是說,類擴充套件所宣告的方法必須依託對應類的實現部分來實現。
⑤定義在 .m 檔案中的類擴充套件方法為私有的,定義在 .h 檔案(標頭檔案)中的類擴充套件方法為公有的。類擴充套件是在 .m 檔案中宣告私有方法的非常好的方式。
最重要的還是類擴充套件是在編譯階段被新增到類中,而類別是在執行時新增到類中。
分類方法未實現,編譯器也不會報警告。
分類方法與原類中相同會優先呼叫分類。
分類的結構體
typedef struct objc_category *category;atomic是在setter和getter方法裡會使用自旋鎖spinlock_t來保證setter方法和getter方法的執行緒的安全。可以看做是getter方法獲取到返回值之前不會執行setter方法裡的賦值**。如果不加atomic,可能在getter方法讀取的過程中,再別的線成立發生setter操作,從而出現異常值。struct objc_category
加上atomic後,setter和getter方法是執行緒安全的,原子性的,但是出了getter方法和setter方法後就不能保證執行緒安全了
@property (atomic, strong) nsarray* arr;被weak修飾的物件在被釋放時候會置為nil,不同於assign;//thread a
for (int i = 0; i < 10000; i ++)
else
}//thread b
for (int i = 0; i < 100000; i ++)
}
runtime維護了乙個weak表,用於儲存指向某個物件的所有weak指標。weak表其實是乙個hash(雜湊)表,key是所指物件的位址,value是weak指標的位址(這個位址的值是所指物件指標的位址)陣列。
1、初始化時:runtime會呼叫objc_initweak函式,初始化乙個新的weak指標指向物件的位址。
2、新增引用時:objc_initweak函式會呼叫 objc_storeweak() 函式, objc_storeweak() 的作用是更新指標指向,建立對應的弱引用表。
3、釋放時,呼叫cleardeallocating函式。cleardeallocating函式首先根據物件位址獲取所有weak指標位址的陣列,然後遍歷這個陣列把其中的資料設為nil,最後把這個entry從weak表中刪除,最後清理物件的記錄。
iOS面試題及答案
1 設計模式是什麼?你知道哪些設計模式,並簡要敘述?設計模式是一種編碼經驗,就是用比較成熟的邏輯去處理某一種型別的事情。1 mvc模式 model view control,把模型 檢視 控制器 層進行解耦合編寫。2 mvvm模式 model view viewmodel 把模型 檢視 業務邏輯 層...
面試題及答案
1.css優先順序演算法如何計算 2.css盒子模型 3.new操作符具體幹了什麼呢 4.dom操作 怎樣新增 移除 複製 建立和查詢節點 5.js有幾種資料型別,分別是什麼 6.js如何判斷乙個陣列 7.如何通過指定名稱建立乙個元素 8.在jquery 中,如何給動態新增的元素繫結事件 9.如何獲...
iOS面試題5 答案
1 寫乙個遞迴方法 計算n的階乘,然後將計算結果進行儲存。以便應用退出後下次啟動課直接獲取該值。double fun int n if n 0 n 1 return 1 else return n fun n 1 2 nsarray和nsmutablearray的區別,多執行緒操作哪個更安全?nsa...