iOS 弱引用weak的使用

2021-10-18 01:41:55 字數 1539 閱讀 2638

oc開發過程中,我們經常會使用到弱引用和強引用

我們為什麼要使用弱引用呢?要想知道這個我們需要weak的原理。

原理:runtime維護了乙個weak表,其實weak是乙個hash(雜湊)表,其中key表示指向物件的指標,value是乙個陣列,裡面儲存的weak指標的位址陣列,當我們使用__weak的時候,我們會先查詢有沒有這麼乙個表,如果沒有,我們會直接建立這個表,並把對應內容寫入,如果存在,他會直接寫入對應內容

那為什麼value是個陣列呢?

因為乙個物件位址可能對應多個weak指標位址

那我們為什麼要使用__weak呢?

在開發過程中,我們能夠使用的到__weak的地方只有block和協議的時候能使用,通過這樣的修飾,我們可以規避掉迴圈引用的問題。

現象再現

typedef void(^block)();

@property (copy, nonatomic) block myblock;

@property (copy, nonatomic) nsstring *blockstring;

- (void)testblock ;

}

上面造成迴圈引用的原因

由於block會對block中的物件進行持有操作,就相當於持有了其中的物件,而如果此時block中的物件又持有了該block,則會造成迴圈引用。
這麼說可以說沒什麼用,他的本質還是沒有說出來,當我們blcok對block內的物件進行操作的時候,會持有物件這樣就會造成引用計數器+1,物件又持有block,造成迴圈引用,導致記憶體瞬間爆表,可能造成程式閃退

那我們如何規避呢

這個我們就要使用到__weak了,當我們使用__weak修飾的物件是不會造成引用計數器+1的,並且引用的物件如果被釋放了以後會自動變成nil,不會出現野指標,很好的解決了記憶體引起的崩潰情況。

所以我們在開發過程中使用delegate和block的時候,一定要處理好迴圈引用的問題。

下面說一下使用問題。

__weak typeof(self) weakself = self;
這樣我們就寫好了,在使用的時候,我們就和使用self是一樣的。

但是這樣使用還是很low,很麻煩,如果很多個地方使用我們就要每個地方一些便,這裡我們可以把他寫成乙個巨集定義,全域性都可以使用

//弱引用

#define weakself(type) __weak typeof(type) weak##type = type;

//強引用

#define strongself(type) __strong typeof(type) strong##type = type;

這裡的強引用和weak是相反的,這裡就不做過多介紹了。

那我們如何使用呢

//這樣就定義了weak

weakself(self);

//下面就是使用,和self是一樣的

[weakself ...方法名];

到此弱引用就介紹和使用就結束了

iOS 強引用( strong)和弱引用(

我們在建立乙個新的物件時經常會這樣做 id obj1 nsobject alloc init 其實系統已經預設我們聲名的這個物件就是強引用型別的id strong obj1 nsobject alloc init 強引用會使物件的引用係數 1 這裡又牽扯到記憶體管理的一些相關問題,有不明白的可以先搜...

iOS 基礎篇 強引用與弱引用

1 在這篇文章主要介紹了ios的強引用與弱引用的差別。2 在文章中使用案例介紹強引用與弱引用的使用環境。3 通過這篇文章我們能夠更加深入的了解強引用與弱引用的差別。1.強引用與弱引用的差別。1 強應用和弱引用的關鍵字 strong weak 2 我們都知道strong和weak的差別,但是要仔細看他...

iOS XCode的weak 引用細節

在ios很多時候在類中建立乙個關聯的物件都使用到了 property weak iboutlet uibutton btn 為什麼要使用到了weak,其實也是可以使用strong的,但是為什麼我們建立的時候就建議我們使用weak的呢?從內部原來展開來看,在uiview中加入了乙個新的ui元素,呼叫了...