避免在block中循环引用(Retain Cycle in Block)
让我们长话短说。请参阅如下代码:
- (IBAction)didTapUploadButton:(id)sender
{
NSString *clientID = @"YOUR_CLIENT_ID_HERE"; NSString *title = [[self titleTextField] text];
NSString *description = [[self descriptionTextField] text]; [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES]; __weak MLViewController *weakSelf = self;
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, ), ^{
UIImage *image = [UIImage imageNamed:@"balloons.jpg"];
NSData *imageData = UIImageJPEGRepresentation(image, 1.0f); [MLIMGURUploader uploadPhoto:imageData
title:title
description:description
imgurClientID:clientID completionBlock:^(NSString *result) {
dispatch_async(dispatch_get_main_queue(), ^{
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];
[[weakSelf linkTextView] setText:result];
});
} failureBlock:^(NSURLResponse *response, NSError *error, NSInteger status) {
dispatch_async(dispatch_get_main_queue(), ^{
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];
[[[UIAlertView alloc] initWithTitle:@"Upload Failed"
message:[NSString stringWithFormat:@"%@ (Status code %d)",
[error localizedDescription], status]
delegate:nil
cancelButtonTitle:nil
otherButtonTitles:@"OK", nil] show];
});
}]; });
}
这是一个上传IMAGE的方法,这一段里面我们可以看到代码:
__weak MLViewController *weakSelf = self;
并且这样使用了weakSelf
[[weakSelf linkTextView] setText:result];
所以我们有一个问题:为什么我们不直接的使用self, 而是用一个weak指针指向他.并且在block区间使用这个weak指针.
这就是我要说的。我们都知道,block的属性是copy、self的属性是retain。因此,如果我们使用self在block部分,我们将得到一个retain循环(互相retain)。他们的内存永远不会释放。出于这个原因,我们必须要按照上面的方法做。
避免在block中循环引用(Retain Cycle in Block)的更多相关文章
- 解决NSTimer循环引用Retain Cycle问题
解决NSTimer循环引用Retain Cycle问题 iOS开发中以下的情况会产生循环引用 block delegate NSTimer 循环引用导致一些对象无法销毁,一定的情况下会对我们横须造成影 ...
- 避免Block的循环引用
避免Block的循环引用 什么是循环引用,什么时候发生循环引用 1 循环引用就是当self 拥有一个block的时候,在block 又调用self的方法.形成你中有我,我中有你,谁都无法将谁释放的困局 ...
- iOS开发Block的介绍以及Block的循环引用问题
1:block的循环引用问题最主要记住两点: 如果[block内部]使用[外部声明的强引用]访问[对象A], 那么[block内部]会自动产生一个[强引用]指向[对象A] 如果[block内部]使用[ ...
- 关于block的循环引用的问题
在block的循环引用的问题上我们都知道如果在block内部修改外部的变量的时候,要加__block以防止循环引用的问题,但是如果block是当前对象的一个属性的时候,要修改当前对象的一个属性的时候就 ...
- Block中的引用循环
原文地址:http://www.cnblogs.com/lujianwenance/p/5910490.html Block在实际的开发中非常的常用,事件回调.传值.封装成代码块调用等等.很多人都对b ...
- iOS - Block的循环引用内存泄漏问题探索
循环引用的原因 众所周知,ARC下用block会产生循环引用的问题,造成泄露的原因是啥呢? 最简单的例子,如下面代码: [self.teacher requestData:^(NSData *data ...
- block之---循环引用
block内部引用外界对象的原则:block会对他内部所有的强指针进行强引用. 验证原理: 在主控制器中modal出ModalVC控制器,ModalVC中有强引用的block属性,在block内部使用 ...
- weakSelf 运用 strongSelf来解决block的循环引用
SDWebImage 中有一段源码: #if SD_UIKIT Class UIApplicationClass = NSClassFromString(@"UIApplication&qu ...
- block的循环引用
什么是循环引用呢? 就是我引用你,你引用我,就会造成循环引用,双方都不会被销毁,导致内存泄漏. _block = ^{ NSLog(@"%@", self); }; block会 ...
随机推荐
- 试水新的Angular4 HTTP API
本文来自网易云社区 作者:梁月康 原文:https://netbasal.com/a-taste-from-the-new-angular-http-client-38fcdc6b359b Angul ...
- IOS开发---菜鸟学习之路--(九)-利用PullingRefreshTableView实现下拉刷新
本章主要讲解如何利用PullingRefreshTableView实现下拉(上拉)刷新的操作 PullingRefreshTableView 实现上下拉刷新的例子百度有很多,大家可以自己搜索下,先看下 ...
- python 字符编码与转码
一. 字符编码 ASCII: 一个字节,最多能表示255个字符 GB2312(1980年):一共收录了7445个字符,包括6763个汉字和682个其它符号. GBK1.0(1995年):收录了2188 ...
- nyoj 1282 部分和问题
部分和问题(入门题) 时间限制:1000 ms | 内存限制:65535 KB 难度:0 描述 给你n个数(a1,a2,a3.......an) ,是否存在某一些数字加起来等于k,有就输出 & ...
- preg_replace_callback 正则替换回调方法用法,
Example #1 preg_replace_callback() 和 匿名函数 <?php /* 一个unix样式的命令行过滤器,用于将段落开始部分的大写字母转换为小写. */ $fp = ...
- BZOJ3997 [TJOI2015]组合数学 【Dilworth定理】
题目 给出一个网格图,其中某些格子有财宝,每次从左上角出发,只能向下或右走.问至少走多少次才能将财宝捡完.此对此问题变形,假设每个格子中有好多财宝,而每一次经过一个格子至多只能捡走一块财宝,至少走多少 ...
- 【VBA】标准Sub/Function定义,带ScreenUpdating、On Error GoTo
[说明] 标准Sub/Function定义,带ScreenUpdating.On Error GoTo Sub AutoFillRole() '--------------- ERROR MSG--- ...
- hdu 2189 dp
/* 类似完全背包,容量为n的背包用素数填,求满背包的种数 dp(i,j)表示用不超过i的素数组成的j的种数 dp[i][j]=dp[i-1][j],若i为素数则dp[i][j]+=dp[i][j-i ...
- HDU3538 A sample Hamilton path
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission( ...
- 【HDOJ5527】Too Rich(贪心,构造)
题意:给定10种面额的货币和它们的数量上限,问构造出恰好总额为P的最小张数,无解输出-1 T=2e4,p<=1e9,c[i]<=1e5 思路:From https://blog.csdn. ...