iOS Block與迴圈引用

2021-10-05 02:40:24 字數 1807 閱讀 5654

迴圈引用的產生:

下面以arc 下為例

a).憂鬱block物件內部引用了外部的變數,而外部的變數又引用了當前的這個block,形成了彼此持有對方。如果外界不主動打斷這種鏈結,那麼就會一直持有,導致當前變數物件無法釋放。

b).如果block內部沒有引用外部變數或者外部變數沒有引用block,則不會構成迴圈引用。

例如masonry布局**,其中self並沒有對masonry進行引用,所以也就不存在迴圈引用問題。

[self.view mas_makeconstraints:^(masconstraintmaker *make) ];

- (nsarray *)mas_makeconstraints:(void(^)(masconstraintmaker *))block

又如下面,當前外部容器也沒有對block進行迴圈引用

- (void)viewdidload ;

tblock();

}

陣列的遍歷不會造成迴圈引用,因為外部變數也沒有引用當前的block

self.mutarr = [nsmutablearray arraywithcapacity:0];

[self.mutarr addobject:@"000"];

[self.mutarr addobject:@"001"];

[self.mutarr addobject:@"003"];

[self.mutarr addobject:@"004"];

[self mas_makeconstraints:^(nsstring *str) ];

解決迴圈引用

1.使用__weak修飾

- (void)test ;

}

上述**因為採用了__weak修飾,導致了block物件內部以weak形式持有person示例,用clang編譯成cpp檔案,檢視如下

//xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc -fobjc-arc -fobjc-runtime=ios-9.0.0 person.m

struct __person__test_block_impl_0

};

2.____unsafe_unretained修飾變數也可以實現接觸迴圈引用的問題,但是不常用,主要原因是因為____unsafe_unretained指向的物件銷毀時,不會自動讓這個指標指向的位址值不變,這樣導致不安全,__weak指向的物件不存在,則會自動置為nil

- (void)test ;

}

3.__block解決迴圈引用問題在block內部對當前 物件進行置nil,同時必要呼叫一次block()。

因為block內部使用__block修飾的當前物件,此時,block引用__block修飾的block物件成員,而此__block物件內部引用當前物件,此時三者形成互相持有關係。

當呼叫block()後,__block物件內部持有的指向當前物件的指標置nill,此時也就解除了批次的迴圈指標指向.

arc下最好的實現,就是用__weak,當然如果在mrc下,也可以使用__block解決,因為mrc下__block物件不會對當前的變數進行retain操作

ios block迴圈引用問題

ios開發中,開了arc模式,系統自動管理記憶體,如果程式中用到了block就要注意迴圈引用帶來的記憶體洩露問題了 這幾天遇到乙個問題,正常頁面dismiss的時候是要呼叫dealloc方法的,但是我的程式就是不呼叫,研究了好久終於找到了問題出在 了 起初的 如下 void getmyrelated...

ios block迴圈引用問題

ios開發中,開了arc模式,系統自動管理記憶體,如果程式中用到了block就要注意迴圈引用帶來的記憶體洩露問題了 這幾天遇到乙個問題,正常頁面dismiss的時候是要呼叫dealloc方法的,但是我的程式就是不呼叫,研究了好久終於找到了問題出在 了 起初的 如下 void getmyrelated...

ios block迴圈引用問題

ios開發中,開了arc模式,系統自動管理記憶體,如果程式中用到了block就要注意迴圈引用帶來的記憶體洩露問題了 這幾天遇到乙個問題,正常頁面dismiss的時候是要呼叫dealloc方法的,但是我的程式就是不呼叫,研究了好久終於找到了問題出在 了 起初的 如下 void getmyrelated...