OC category 為什麼不能新增成員變數

2022-05-12 13:29:02 字數 1123 閱讀 3097

1. 利用執行時實際上也不是新增成員變數。已編譯的類的記憶體布局是不變的,class就是乙個結構體,裡面的成員不能改變。但是通過執行時可以將乙個物件或基礎型別變成指定class物件的乙個關聯物件,他們兩者的記憶體布局是分開的,與成員變數不同。

2.關聯的並不是在指定class上,而是指定的物件上,概念上有一定差別。

objc_setassociatedobject()這個函式接收四個引數,第乙個是需要關聯的物件,第二個是索引的乙個key,第三個是被關聯物件,第四個是記憶體管理型別。

所以這裡執行時會為某個物件設乙個關聯鍵值對,通過key可以找到對應的關聯物件。

objc_getassociatedobject(),接收關聯物件和key提取出被關聯物件。

3.rumtime的話是黑魔法,濫用起來的話oc會變成js,動態能力太強,什麼都可以通過執行時來改。。但同時也讓維護變得非常困難,就像交換方法這種,如果故意惡作劇在一些foundation裡交換了一些常用方法。。這就坑爹了。

runloop的話如果不涉及優化的話也不是很常用,通常是通過新增觀察者響應runloop狀態的**從而進行一些操作,例如在runloop空閒的時候扔一些任務給他做做。

4.oc是不能直接修改物件的結構體的成員變數屬性,一般做法是先取出物件的結構體變數,修改該取出來的結構體變數裡面的成員,再把結構體物件賦值給原來的結構體變數;這個就要弄清@property關鍵字了,在類中@property關鍵字會生成私有成員變數,和申明getter setter方法,但是在分類中只會宣告getter和setter方法,不會生成成員變數;擴充套件: 如果在.m中手動實現了setter和getter方法,x-code就不會自動生成@synthesize,也就不會生成成員變數;點語法訪問的是getter方法,物件的->呼叫才是訪問的成員變數

5.如果我們真的需要給category增加屬性的實現,需要借助於執行時的兩個函式:

objc_setassociatedobject

objc_getassociatedobject

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

為什麼中斷不能休眠

1.中斷處理的時候,不應該發生程序切換,因為在中斷context中,唯一能打斷當前中斷handler的只有更高優先順序的中斷,它不會被程序打斷 這點對 於softirq,tasklet也一樣,因此這些bottom half也不能休眠 如果在中斷context中休眠,則沒有辦法喚醒它,因為所有的 wa...

為什麼中斷不能休眠

1.中斷處理的時候,不應該發生程序切換,因為在中斷context中,唯一能打斷當前中斷handler的只有更高優先順序的中斷,它不會被程序打斷 這點對 於softirq,tasklet也一樣,因此這些bottom half也不能休眠 如果在中斷context中休眠,則沒有辦法喚醒它,因為所有的 wa...

為什麼生物不能永生?

我之有這個疑惑並不是因為我怕死,那時候我什麼都不怕,只怕我自己。我有這個疑惑是因為我學糊塗了,學生物學糊塗了。那時我剛接觸達爾文演化論,知道了什麼叫做 物競天擇,適者生存 就是這八個字,成為我疑惑的開端。當時我是這麼想的,如果有乙個物種可以永生,在相同的生存條件下,種群的增長速率會比沒有這種基因要高...