1. 程式人生 > >block裡使用self引起迴圈引用的研究

block裡使用self引起迴圈引用的研究

方法裡定義的block直接呼叫self,不會產生迴圈引用:

下面的這個block不會引起迴圈引用,因為block執行時在棧裡 。但是block一直執行的話,self是不能回收的,必須在block執行結束後,self才可以被回收。
-(void)btnAction{
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
          self.property = 1000;
    });
}


下面的會引起迴圈引用,因為testBlock是物件的屬性,儲存在堆裡。

@interface VC2 ()
{
void(^_aBlock)();
}
@property(copy)void(^testBlock)();


@property(assign)int x;
@end


@implementation VC2
-(void)btnAction{
    self.testBlock = ^(){
      //會迴圈引用,因為testBlock物件這時在堆裡。
       self.x =  1000;
    };

   _aBlock = ^(){
       //會迴圈引用。
self.x = 1000;
   }
}
@end

相關推薦

block使用self引起迴圈引用研究

方法裡定義的block直接呼叫self,不會產生迴圈引用: 下面的這個block不會引起迴圈引用,因為block執行時在棧裡 。但是block一直執行的話,self是不能回收的,必須在block執行結束後,self才可以被回收。 -(void)btnAction{    

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

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

如何避免在Blockself造成迴圈引用

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

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

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

block使用小結、在arc中使用block、如何防止迴圈引用

使用block已經有一段時間了,感覺自己瞭解的還行,但是幾天前看到CocoaChina上一個關於block的小測試主題 : 【小測試】你真的知道blocks在Objective-C中是怎麼工作的嗎?,發現竟然做錯了幾道, 才知道自己想當然的理解是錯誤的,所以抽時間學習了下,並且通過一些測試程式碼進行測試

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

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

blockself、weakSelf、strongSelf

ARC下,關於block裡面使用self、weakSelf、strongSelf,理解一直沒有特別的透徹,今天花時間研究了一下,總結如下:   其實一共就涉及到兩個問題: 1.是否迴圈引用了 2.block裡面的程式碼

swift迴圈引用問題

在參加面試的時候經常會被問得一個問題就是“你在工作中有沒有遇到迴圈引用的情況?” 首先我們先看段程式碼 var newSuccessCb: (() -> ())? override func viewDidLoad() { super.viewDidLoa

iOS 中block迴圈引用問題

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

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

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

block迴圈引用的問題

在我們的編寫程式碼的時候,常常會出現一些迴圈引用的問題,今天就說說block的迴圈引用,引起的物件無法被釋放的問題 先說一下我們驗證問題的方法: -1.Navigationcontroller巢狀vc1; -2.由vc來push vc2;

防止Block迴圈引用(技巧)

技巧1: __weak typeof(self)weakSelf=self; dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_

Block 迴圈引用淺談

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

如何避免block迴圈引用

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

正確使用Block避免迴圈引用(二)

在客戶端app開發中一般都採用的是MVC(model,view,controller的簡稱)的分層開發模式,目的是降低程式碼之間的耦合度,提高程式碼複用率,以及更便於後期的程式碼維護,好處不多說。往往開發中在Controller層往往是程式碼堆砌最多的地方,應該

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

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

block程式設計第五篇】block中使用 weak–strong dance 技術避免迴圈引用

----------------------------------------歡迎檢視block連載部落格【點選】-----------------------------------------------【block程式設計第一篇】block語法            

iOS Block迴圈引用問題

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

防止Block迴圈引用

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

iOS Block迴圈引用的解決

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