1. 程式人生 > >__block關鍵字解決block的迴圈引用

__block關鍵字解決block的迴圈引用

大家都知道,__weak宣告能解決迴圈應用,其實,__block也能解決迴圈引用!

怎麼解決的?先說一下__block的作用:用其修飾的外部變數,我們可以在blcok中才能修改該變數。

那為什麼用__block修飾的變數才能在block中修改呢?我們知道,區域性變數是存放在棧中的,所在的函式退出後棧也被清空。有被清空的危險,而__block的作用就是將該變數複製到堆上去,自己管理宣告週期!這樣就不存在清空的危險,block頁知道改外部變數是存在的,修改是安全的。

先看看__block是怎麼解決迴圈引用的:

__block MyObject *myobject = self;

self.block = ^{

  NSLog(@"%@", myobject.ob1);

  myobject = nil;

};

原因其實也是將self複製一份到堆上,然後在block中用完後手動釋放掉!(myobject = nil)

相關推薦

__block關鍵字解決block迴圈引用

大家都知道,__weak宣告能解決迴圈應用,其實,__block也能解決迴圈引用! 怎麼解決的?先說一下__block的作用:用其修飾的外部變數,我們可以在blcok中才能修改該變數。 那為什麼用__block修飾的變數才能在block中修改呢?我們知道,區域性變數是存放在

iOS之__block、__weak、Block迴圈引用、__weak typeof(self) weakSelf = self;

在介紹block迴圈引用前我們先了解一下typeof。我們經常可以看到這樣的程式碼:__weak typeof(self) weakSelf = self;、 block對於其變數都會形成強引用(retain),對於self也會形成強引用(retain) ,而如果self本

Block 迴圈引用淺談

Block 的迴圈引用問題,想必使用過 Block,幾乎都遇到過。今天CodeReview時,發現還存在迴圈引用的問題。故簡單記錄如下: 一、迴圈引用的原因 簡單來說就是,【互相持有,造成記憶體不釋

如何避免block迴圈引用

公司最近在招 iOS,我面試了幾個人,問到 block 避免迴圈引用的問題時,發現好多人都說通過新增 __block 修飾詞來避免。再加上我對__block和__weak也沒有區分的太明確,搞得我都有點兒懷疑我自己以前是不是用錯了。正好借這個機會來一探究竟~ 準備工作 首先我定義了一個類 MyObje

防止Block迴圈引用

防止block的迴圈引用時,使用__weak關鍵字做如下定義: __weak typeof(self) weakSelf = self; 在專案中多次用到時, 可以定義一個巨集,不是每次都要寫這一行程式碼 #define WeakSelf __weak typeof

iOS之解決強弱迴圈引用的巨集

一,完整程式碼: #define WeakSelf @weakify(self); #define StrongSelf @strongify(self); #ifndef weakify #if

解決fastjson迴圈引用問題(死迴圈

在雙向對映的一方向中新增“@JSONField(serialize=false)”。 @JSONField(serialize = false) public java.util.Set<CmsDocReceiveFile> getCmsDocRe

iOS中block的詳解weakSelf、strongSelf,以及block迴圈引用的避免。

1我們知道,在使用 block 的時候,為了避免產生迴圈引用,通常需要使用 weakSelf 與 strongSelf,寫下面這樣的程式碼:__weak typeof(self) weakSelf = self; [self doSomeBlockJob:^{ __s

iOS開發記憶體優化之自動檢測記憶體洩露,檢查是否有迴圈引用,檢查記憶體為何如此大,Block迴圈引用的檢查

手機裝置的記憶體是一個共享資源。應用程式可能會不當的耗盡記憶體、崩潰,或者遭遇大幅度的效能降低。 Facebook iOS客戶端有很多功能,並且它們共享同一塊記憶體空間。如果任何特定的功能消耗過多的記憶體,就會影響到整個應用程式。這是可能發生的,比如,這個功能導致了記

關於block 迴圈引用 weakSelf

什麼是block? 程式碼塊:{}裡的東西 block可以想id一樣裝到array裡,dictionary裡。。。但是不能對他傳送訊息。 nsdictionary 裡有一個方法:enumerateKeysAndObjectUsingBlock:^(id key,id va

ios block迴圈引用問題

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

iOS開發-Block使用及迴圈引用解決

Block是一種比較特殊的資料型別。它可以儲存一段程式碼,在合適的時候取出來呼叫。 ◦   我們可以把Block當做Objective-C的匿名函式。Block允許開發者在兩個物件之間將任意的語句當做資料進行傳遞,往往這要比引用定義在別處的函式直觀。另外,block的實現具

iOS Block迴圈引用解決

前言: 在iOS 中使用block 時 ,如果稍微不注意,則很容易 導致 迴圈引用 導致記憶體洩漏 二者都無法釋放 。出現記憶體洩漏。 #import <Foundation/Foundation.h> typedefvoid (^EOCNetworkFet

iOS開發——Block引起迴圈引用解決方案

       記憶體問題始終是軟體開發中的頭等大事,iOS開發中也不例外,在面試中也是必問的問題。今天我們主要來講講Block中涉及的迴圈引用問題。當我們自己一開始寫程式碼的時候,可能會大量在block中使用self,但是當看到別人優秀的程式碼的時候,發現別人常常不是用sel

block解決迴圈引用(二)

接著上一遍,這裡首先講一下 block的反向傳值 ViewController和ViewController1 //ViewController1裡面 typedef void(^MyBl

block解決迴圈引用(一)

看了網上的一些資料,感覺暈乎乎的,還不是很明白。自己抽了一個下午仔細的研究了一下block,嗯,明白了好多。分兩次寫出來,歡迎大家交流。 這裡不討論底層,不討論原理,注重實用! 什麼是block? 閉包(block):閉包就是獲取其他函

weakSelf 運用 strongSelf來解決block的循環引用

div 沒有 som oba 比較 red bili dba color SDWebImage 中有一段源碼: #if SD_UIKIT Class UIApplicationClass = NSClassFromString(@"UIApplicatio

Spring 迴圈引用解決方案

Spring 迴圈引用解決方案 一、問題呈現:   上述memberMerchantService 和 memberService 互相引用或者深層注入引用 導致專案啟動不了 【詳細問題描述】: Bean with name ‘xxxS

vue 解決迴圈引用元件報錯的問題

問題由來 最近在做專案的時候遇到使用迴圈元件,因為模式一樣,只有資料不一樣。按照普通元件呼叫格式來做的時候總是報錯,錯誤資訊為[Vue warn]: Unknown custom element: <selfile> - did you register

iOS 中block迴圈引用問題

開發中經常使用weakSelf和strongSelf來解決block的迴圈引用問題,但是是不是所有的block都會導致迴圈引用呢?顯然不是的,那麼怎麼判斷呼叫一個帶有block方法時是否會造成迴圈引用呢,我們來分析一下。 首先我們來寫一個含有block的類,並呼叫自己,然後在外部實現這個