文档章节

IOS 学习---block块的内存管理,及解决循环引用的方法

fengyun321
 fengyun321
发布于 2015/09/14 20:35
字数 440
阅读 166
收藏 0

在MRC环境下: 

block对局部变量的影响:

    

         使用局部变量:ablock块中,为了在block中能够使用这个变量,将a拷贝放到常量区  域 

    int a = 10;  

    如果访问局部对象,为了在block中能够使用这个对象,引用计数值加一

    如果使用__block修饰,计数值则不加一

    __block NSMutableArray *array = [[NSMutableArray alloc]initWithObjects:@"张三",@"李四",@"王五", nil];  //1
    
    [button addTapBlcok:^(UIButton *button){
        
//        a = 90;
        
        NSString *str = [array objectAtIndex:2];
        NSLog(@"str:%@",str);
    }];
    
    [array release];

block对全局变量的影响

   block在访问全局变量、方法的时候,会将这个变量对应的对象计数值加一

   block -> self -> self.view -> button -> block    

   解决方式:使用__block修饰self  

   总结:在MRC环境中__block的作用:(1)可以在block中修改变量值  2block内部访问属性的时候,可以使用__block修饰,避免计数值加一(解决循环引用问题


    MyButton *button = [MyButton buttonWithType:UIButtonTypeCustom];
    button.frame = CGRectMake(90, 90, 90, 90);
    button.backgroundColor = [UIColor redColor];
    [self.view addSubview:button];
    
    __block SecondViewController *this = self;
    
    [button addTapBlcok:^(UIButton *button){
    
//        this->_index = 20;
        
//        NSLog(@"%ld",this->_index);
        
        [this test];
        
    }];
    
}

- (void)test {

    NSLog(@"test");
}

在ARC环境下:

__block:(1)可以让局部变量在block中修改数据

//在ARC环境中
    //__block:(1)可以让局部变量在block中修改数据
    __block int a = 9;
    
    [button addTapBlcok:^(UIButton *button){
    
        a = 2;
        NSLog(@"a:%d",a);
        
    }];


解决循环引用问题

使用__weak修饰self

//在ARC环境中的解决方法:
//    strong  weak
    __weak SecondViewController *weakThis = self;
    
    [button addTapBlcok:^(UIButton *button){
    
        //在调用方法的时候,解决了循环引用问题
//        [weakThis test];
        
        //weakThis无法访问当前的属性
        __strong SecondViewController *strongThis = weakThis;
        strongThis->_index = 20;
        NSLog(@"%ld",strongThis->_index);
        
        [strongThis test];
        
    }];

}

- (void)test {
    NSLog(@"test");
}


  


© 著作权归作者所有

fengyun321
粉丝 3
博文 31
码字总数 16462
作品 0
海淀
程序员
私信 提问
2018 iOS 面试题大全(补充完整版)

原文地址:2018 iOS 面试题大全 由于原作者并没有继续更新,这里我转过来继续更新下 这个栏目将持续更新--请iOS的小伙伴关注! 1、iOS 应用导航模式有哪些? 2、iOS 中持久化方式有哪些? 3、...

Theendisthebegi
2018/11/15
0
0
IOS 浅谈闭包block的使用

前言:对于ios初学者,block通常用于逆向传值,遍历等,会使用,但是可能心虚,会感觉block很神秘,那么下面就一起来揭开它的面纱吧。 ps: 下面重点讲叙了闭包的概念,常用的语法,以及访问变...

周雨奇
2018/07/23
0
0
iOS 编写高质量Objective-C代码(五)

级别: ★★☆☆☆ 标签:「iOS」「内存管理」「Objective-C」 作者: MrLiuQ 审校: QiShare团队 前言: 这几篇文章是小编在钻研《Effective Objective-C 2.0》的知识产出,其中包含作者和小...

QiShare
2018/09/05
0
0
iOS查看屏幕帧数工具--YYFPSLabel

学习 YYKit 代码时,发现 ibireme 在项目里加入的一个查看当前屏幕帧数的小工具,效果如下: 挺实用,实现方法也很简单,但是思路特别棒。 这里是Demo: YYFPSLabel 这里我把这个小工具从 中...

yehot
2016/04/05
0
0
【iOS】定义@property时常用的修饰词介绍

iOS编程中,定义成员变量常用格式如下: 常用的修饰词有atomic,nonatomic,copy,assign,strong,weak,readonly,readwrite等。面试中也会常常被问到这些修饰词的含义及其之间的区别,其本...

浅浅青丘
2018/06/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

rime设置为默认简体

转载 https://github.com/ModerRAS/ModerRAS.github.io/blob/master/_posts/2018-11-07-rime%E8%AE%BE%E7%BD%AE%E4%B8%BA%E9%BB%98%E8%AE%A4%E7%AE%80%E4%BD%93.md 写在开始 我的Arch Linux上......

zhenruyan
今天
4
0
简述TCP的流量控制与拥塞控制

1. TCP流量控制 流量控制就是让发送方的发送速率不要太快,要让接收方来的及接收。 原理是通过确认报文中窗口字段来控制发送方的发送速率,发送方的发送窗口大小不能超过接收方给出窗口大小。...

鏡花水月
今天
8
0
OSChina 周日乱弹 —— 别问,问就是没空

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @tom_tdhzz :#今日歌曲推荐# 分享容祖儿/彭羚的单曲《心淡》: 《心淡》- 容祖儿/彭羚 手机党少年们想听歌,请使劲儿戳(这里) @wqp0010 :周...

小小编辑
今天
907
11
golang微服务框架go-micro 入门笔记2.1 micro工具之micro api

micro api micro 功能非常强大,本文将详细阐述micro api 命令行的功能 重要的事情说3次 本文全部代码https://idea.techidea8.com/open/idea.shtml?id=6 本文全部代码https://idea.techidea8....

非正式解决方案
今天
5
0
Spring Context 你真的懂了吗

今天介绍一下大家常见的一个单词 context 应该怎么去理解,正确的理解它有助于我们学习 spring 以及计算机系统中的其他知识。 1. context 是什么 我们经常在编程中见到 context 这个单词,当...

Java知其所以然
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部