如何避免在Block裡用self造成迴圈引用
一般來說我們總會在設定Block之後,在合適的時間回撥Block,而不希望回撥Block的時候Block已經被釋放了,所以我們需要對Block進行copy,copy到堆中,以便後用。
當一個Block被Copy的時候,如果你在Block裡進行了一些呼叫,那麼將會有一個強引用指向這些呼叫方法的呼叫者,有兩個規則:
- 如果你是通過引用來訪問一個例項變數,那麼將強引用至self
- 如果你是通過值來訪問一個例項變數,那麼將直接強引用至這個“值”變數
上面第一種情況相當於用self.xxx來訪問例項變數,所以強引用指向了self;第二種情況把例項變數變成了本地臨時變數,強引用將直接指向這個本地的臨時變數。大多數情況下,我們只用處理第一種情況就行了,因為第二種情況雖然會造成迴圈引用,但是臨時變數很快就被釋放了,不會造成真正的迴圈引用。要避免強引用到self的話,用__weak把self重新引用一下就行了,像這樣:
__weak ViewController *weakSelf = self;
相關推薦
如何避免在Block裡用self造成迴圈引用
一般來說我們總會在設定Block之後,在合適的時間回撥Block,而不希望回撥Block的時候Block已經被釋放了,所以我們需要對Block進行copy,copy到堆中,以便後用。當一個Block被Copy的時候,如果你在Block裡進行了一些呼叫,那麼將會有一個強引用指向
block裡使用self引起迴圈引用的研究
方法裡定義的block直接呼叫self,不會產生迴圈引用: 下面的這個block不會引起迴圈引用,因為block執行時在棧裡 。但是block一直執行的話,self是不能回收的,必須在block執行結束後,self才可以被回收。 -(void)btnAction{
精通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
block裡的self、weakSelf、strongSelf
ARC下,關於block裡面使用self、weakSelf、strongSelf,理解一直沒有特別的透徹,今天花時間研究了一下,總結如下: 其實一共就涉及到兩個問題: 1.是否迴圈引用了 2.block裡面的程式碼
【原】iOS容易造成迴圈引用的三種場景,就在你我身邊!
ARC已經出來很久了,自動釋放記憶體的確很方便,但是並非絕對安全絕對不會產生記憶體洩露。導致iOS物件無法按預期釋放的一個無形殺手是——迴圈引用。迴圈引用可以簡單理解為A引用了B,而B又引用了A,雙方都同時保持對方的一個引用,導致任何時候引用計數都不為0,始終無法釋放。若當前物件是一個ViewControll
講述Sagit.Framework解決:雙向引用導致的IOS記憶體洩漏(下)- block中任性用self
前言: 發現業務程式碼有一個地方的記憶體沒釋放,原因很也簡單: 在block裡用到了self,造成雙向引用,然後就開始思考怎麼處理這個問題。 常規則思維,就是改程式碼,block不要用到self,或只用self的弱引用。 只是框架這裡特別,有一個特好用的系列,STLastXXX系列,是用巨集定
如何避免block迴圈引用
公司最近在招 iOS,我面試了幾個人,問到 block 避免迴圈引用的問題時,發現好多人都說通過新增 __block 修飾詞來避免。再加上我對__block和__weak也沒有區分的太明確,搞得我都有點兒懷疑我自己以前是不是用錯了。正好借這個機會來一探究竟~ 準備工作 首先我定義了一個類 MyObje
正確使用Block避免迴圈引用(二)
在客戶端app開發中一般都採用的是MVC(model,view,controller的簡稱)的分層開發模式,目的是降低程式碼之間的耦合度,提高程式碼複用率,以及更便於後期的程式碼維護,好處不多說。往往開發中在Controller層往往是程式碼堆砌最多的地方,應該
【block程式設計第五篇】block中使用 weak–strong dance 技術避免迴圈引用
----------------------------------------歡迎檢視block連載部落格【點選】-----------------------------------------------【block程式設計第一篇】block語法
iOS中block的詳解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本
探討OC的記憶體管理 以及防止迴圈引用retain cycle 代理為什麼用weak block為什麼用copy
首先宣告OC的記憶體管理機制:引用計數。 當一個物件的引用計數為0時,這個物件就會被釋放。 銘記以上兩點,我們開始來探討。 換句話說,如果一個物件,沒有強指標指向,就會被釋放。 舉個很形象的例子,假如每一個物件都是一隻狗,每一個強指標都是狗鏈子
iOS 不使用 Weak-Strong Dance,怎麼避免迴圈引用?
疑惑 以下是引用: 這是來自 PopCustomAnimation.h /** @param target The object being animated. Reference the passed in target to help avoid retain loo
iOS中self.property 和_property的區別,init和dealloc為何避免用self.property
一、self.property訪問 1、self.property 經過oc訊息派發,可以完成屬性所定義的“記憶體管理語義”, 例如copy屬性; 2、通過屬性訪問,可以設定斷點除錯。 二、_property直接訪問例項變數 1、_property直接訪問例項變
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_