1. 程式人生 > >iOS Block的迴圈引用問題

iOS Block的迴圈引用問題

在iOS開發中,block在不同介面的回撥傳值有著舉足輕重的分量,但如果用的不恰當的話,可能會引發記憶體問題,在微信公眾號和部落格中都看到這篇文章,感覺說的在理,就在這裡分享給大家了,希望能對大家有幫助。

前言

本篇文章精講iOS開發中使用Block時一定要注意記憶體管理問題,很容易造成迴圈引用。本篇文章的目標是幫助大家快速掌握使用block的技巧。

我相信大家都覺得使用block給開發帶來了多大的便利,但是有很多開發者對block記憶體管理掌握得不夠好,導致經常出現迴圈引用的問題。對於新手來說,出現迴圈引用時,是很難去查詢的,因此通過Leaks不一定能檢測出來,更重要的還是要靠自己的分析來推斷出來。

聲景一:Controller之間block傳值

現在,我們宣告兩個控制器類,一個叫ViewController,另一個叫HYBAController。其中,ViewController有一個按鈕,點選時會push到HYBAController下。

先看HYBAController:

1 2 3 4 5 6 7 // 公開了一個方法 -(instancetype)initWithCallback:(HYBCallbackBlock)callback; // 非公開的屬性,這裡放出來只是告訴大家,HYBAController會對這個屬性強引用
@property(nonatomic,copy)HYBCallbackBlockcallbackBlock;

下面分幾種小場景來看看迴圈引用問題:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 @interfaceViewController() // 引用按鈕只是為了測試 @property(nonatomic
,strong)UIButton*button; // 只是為了測試記憶體問題,引用之。在開發中,有很多時候我們是 // 需要引用另一個控制器的,因此這裡模擬之。 @property(nonatomic,strong)HYBAController*vc; @end // 點選button時 -(void)goToNext{ HYBAController*vc=[[HYBAControlleralloc] initWithCallback:^{ [self.button setTitleColor:[UIColorgreenColor] forState:UIControlStateNormal]; }]; self.vc=vc; [self.navigationController pushViewController:vc animated:YES]; }

現在看ViewController這裡,這裡在block的地方形成了迴圈引用,因此vc屬性得不到釋放。分析其形成迴圈引用的原因(如下圖):

image

可以簡單說,這裡形成了兩個環:

  • ViewController->強引用了屬性vc->強引用了callback->強引用了ViewController
  • ViewController->強引用了屬性vc->強引用了callback->強引用了ViewController的屬性button

對於此這問題,我們要解決記憶體迴圈引用問題,可以這麼解:

不宣告vc屬性或者將vc屬性宣告為weak引用的型別,在callback回撥處,將self.button改成weakSelf.button,也就是讓callback這個block對viewcontroller改成弱引用。如就是改成如下,記憶體就可以正常釋放了:

1 2 3 4 5 6 7 8 9 10 -(void)goToNext{ __weak__typeof(self)weakSelf=self; HYBAController*vc=[[HYBAControlleralloc] initWithCallback:^{ [weakSelf.

相關推薦

ios block迴圈引用問題

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

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

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

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

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

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

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

Block 迴圈引用淺談

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

如何避免block迴圈引用

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

防止Block迴圈引用

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

關於block 迴圈引用 weakSelf

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

iOS 防止迴圈引用的兩個方法

__block UITableViewController *weakself = self; [self.tableView addJElasticPullToRefreshViewWithActionHandler:^{

IOS迴圈引用及解決方法

何為迴圈引用: 迴圈引用可以簡單理解為A引用了B,而B又引用了A,雙方都同時保持對方的一個引用,導致任何時候引用計數都不為0,始終無法釋放。 後果: 記憶體不能及時釋放,導致記憶體洩漏,引發程式崩潰。 幾種迴圈引用情景: 1、delegat

iOSblock迴圈引用問題

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

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

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

ios開發之使用block引發迴圈引用導致記憶體洩露

// // JLPerson.h // BlockTest // // Created by Mac on 15-3-28. // Copyright (c) 2015年 vxinyou. All rights reserved. // #import typedef void (^MyBloc

iOS Block迴圈引用問題

在iOS開發中,block在不同介面的回撥傳值有著舉足輕重的分量,但如果用的不恰當的話,可能會引發記憶體問題,在微信公眾號和部落格中都看到這篇文章,感覺說的在理,就在這裡分享給大家了,希望能對大家有幫助。 前言 本篇文章精講iOS開發中使用Block時一定

iOS Block迴圈引用的解決

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

精通iOS開發--第15章 Grand Central Dispatch和後臺處理之Block與Self的迴圈引用

Block與Self的迴圈引用 01:眾所周知若self中引用了Block塊,而此Block塊中又引用了Self則會造成迴圈引用,需要提醒的是即使在你的block程式碼中沒有顯式地出現"s

iOS容易造成迴圈引用的三種場景之Block以及對應的使用方法(二)

         可以看到在Block結構體中含有isa指標,這就證明了Block其實就是物件,並具有一般物件的所有功能。這個isa指標被初始化為_NSConcreteStackBlock或者_NSConcreteGlobalBlock類的地址。在沒有開啟ARC的情況下,如果Block中包含有區域性變數則is

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

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

iOS 不使用 Weak-Strong Dance,怎麼避免迴圈引用

疑惑 以下是引用: 這是來自 PopCustomAnimation.h /** @param target The object being animated. Reference the passed in target to help avoid retain loo

如何避免在Block裡用self造成迴圈引用

一般來說我們總會在設定Block之後,在合適的時間回撥Block,而不希望回撥Block的時候Block已經被釋放了,所以我們需要對Block進行copy,copy到堆中,以便後用。當一個Block被Copy的時候,如果你在Block裡進行了一些呼叫,那麼將會有一個強引用指向