weak strong 巨集的實現

2021-07-26 06:47:37 字數 2149 閱讀 7259

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

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

#define

weakself __weak typeof(self) weakself = self;

之後,我們可以比較方便的在需要的地方:

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(self);

...[selfweak dosomething];

是不是感覺挺高大上的? 

這裡是利用了@autoreleasepool{}這個系統的關鍵字來實現的,其實還可以利用@try{}@finally{}這個也可以達到相同的效果,比如:

#define

weakobj(o) try

{}@finally{} __weak typeof(o) o##weak = o;

這部分空的@try或者空的@autoreleasepool會在編譯時被優化掉,不必擔心效能問題。

至此,我們的巨集已經可以用了,但是實際使用中,出現了乙個很尷尬的問題,就是**自動補全,@w並不能自動提示出該巨集,所以每次都是很尷尬的先利用提示,寫完weakobj(obj),然後游標移動到前面去打上乙個@符號。 

這種事情怎麼能忍受? 

還好我們還有利器,xcode的codesnippet,任意方法內,寫一句**

@weakobj();
拖到xcode的codesnippet區域,快捷鍵設定為@weakobj即可。 

至此,愉快的使用@w即可自動補全出該巨集了。。

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

#define strongobj(o) autoreleasepool{} __strong typeof(o) o = o##weak;
用處嘛簡單寫個例子:

@weakobj(self);

[var setblock:^];

最後,揭曉為什麼該巨集生成的變數名是objweak: 

1. 使用時,如果開發者習慣性的要打出 [self dosomething]時,當他輸入self時,自動補全出來的部分能看到還有selfweak可供選擇,算是一種提醒方式。 

2. 如果weak前置,當然也可以,生成的會是weakobj這樣的變數名,只需要把巨集中o##weak換成weak##o

好了,這篇文章希望對一些人有些啟發或幫助。

最後曬出個人在用的巨集定義:

#define rcweak(o) autoreleasepool{} __weak typeof(o) o##weak = o;

#define

rcstrong(o) autoreleasepool{} __strong typeof(o) o = o##weak;

weak strong建立控制項的區別

weak strong建立控制項的區別 weak atrong主要是為了避免迴圈強引用 比如父類中含有子類,子類中又呼叫了父類,這樣都無法release 一般來說用weak會比較好,但是大多情況下strong也沒問題。這個主要取決於這個view是否將引用它的物件強引用了。當然這種情況還是比較少的。w...

實現巨集offsetof

offsetof 型別,成員 返回成員偏移量 具有函式形式的此巨集返回資料結構或聯合型別型別中成員成員的偏移值 以位元組為單位 返回的值是size t型別的無符號整數值,以及指定成員與其結構開頭之間的位元組數。定義乙個結構體指標s a 未初始化的這個指標是乙個野指標 並沒有指向有效合法的記憶體空間 ...

sizeof 巨集實現的方法

建立人 ruo xiao 非陣列的sizeof defne sizeof t size t t 0 1 陣列的sizeof define array sizeof t size t t 1 size t t 1 指標變數 1 這裡 的是指標型別對應的位元組數。栗子 sizeof double 其過程...