weakSelf相關知識

2021-07-15 01:44:43 字數 2019 閱讀 9825

預設strong,可選weak。strong下不管成員變數還是property,每次使用指標指向乙個物件,等於自動呼叫retain(), 並對舊物件呼叫release(),所以設為nil等於release。

只要某個物件被任一strong指標指向,那麼它將不會被銷毀,否則立即釋放,不用等runloop結束。所有strong指標變數不需要在dealloc中手動設為nil,ios會自動處理,debug可以看到全部被置為nil,最先宣告的變數最後呼叫dealloc釋放。

官方建議iboutlet加上__weak,實際上不用加也會自動釋放;

優先使用私有成員變數,除非需要公開屬性才用property。

避免迴圈引用,否則手動設定nil釋放。

block方法常用宣告:@property (copy) void(^myblock)(void); 如果超出當前作用域之後仍然繼續使用block,那麼最好使用copy關鍵字,拷貝到堆區,防止棧區變數銷毀。

建立block匿名函式之前一般需要對self進行weak化,否則造成迴圈引用

typeof的引數可以是兩種形式:表示式或型別。

關鍵字typeof用於獲取表示式的資料型別。只有部分編譯器支援,這個特性在linux核心中應用非常廣泛,很顯然clang支援這個特性。

侷限:typeof構造中的型別名不能包含儲存類說明符,如extern或static。不過允許包含型別限定符,如const或volatile。例如,下列**是無效的,因為它在typeof構造中宣告了extern:

typeof(extern int) a;
我們都知道在防止如block的迴圈引用時,會使用__weak關鍵字做如下定義:

__ typeof() weakself = ;
後來,為了方便,不用每次都要寫這樣一句固定**,我們定義了巨集:

#define weakself __weak typeof() weakself = ;
之後,我們可以比較方便的在需要的地方:

weakself;

[weakself dosomething];

再後來,我們發現不止self需要使用weak,可能有部分變數也需要weak,於是我們的巨集繼續進化,不僅僅只支援self:

#define weakobj(o) __weak typeof(o) o##weak = o;
這樣,後續對需要使用weak的物件,只要寫一句weakobj(obj) 即可使用objweak變數了(ps:發現沒有,這裡生成的變數名其實是objweak,並不是weakobj,原因見文章末的注1)

再後來,我們發現了一些小技巧,可以讓我們的這個巨集看起來更原生一些,我們新增了@符號在前面:

#define weakobj(o) autoreleasepool{} __weak typeof(o) o##weak = o;
使用上看起來是這樣

@weakobj(obj);

[selfweak dosomething];

是不是感覺挺高大上的?

這個@只是為了讓這個巨集定義看起來更像一條指令,並沒有其他的作用,不會對實際**產生什麼影響,乙個小trick。這裡是利用了@autoreleasepool{}這個系統的關鍵字來實現的,其實還可以利用@try{}@finally{}這個也可以達到相同的效果,比如:

#define weakobj() @finally{} __weak typeof(o) o##weak = o;
這部分空的@try或者空的@autoreleasepool會在編譯時被優化掉,不必擔心效能問題。

還有相應的strong巨集,一併曬在這裡

#define strongobj(o) autoreleasepool{} __strong typeof(o) o = o##weak;
參考:

1. 2.

3.

關於block 迴圈引用 weakSelf

block 塊裡用到的東西,比如主線程裡的全域性變數,區域性變數,ui等,block都會對它指向乙個strong指標。也就是說,區域性變數所在的區域性 執行完後,區域性變數不會釋放,直到block消失,它才釋放。這個不太好,這樣如果block 裡面有self.something,而block又儲存在...

Dealloc 時取 weak self 引起崩潰

今天無意這中遇到乙個奇怪的崩潰,先上引起崩潰的 void dealloc 當執行到dealloc的時候,程式就crash 掉了。崩潰資訊如下 to instance 0x160f6f890 of class mfchatroomboardcontroller.it is possible that ...

mysql相關知識 MySQL相關知識

字串拼接 select from tablename where mydata like concat curdate limit 3 這裡concat是字串拼接,concat mys q l mysql 顯示日期不帶時間的函式,如 2015 05 14 curdate 是日期不算時間 2015 0...