文档章节

第04天实战技术(05):Block内存管理(ARC)

宇鸿165
 宇鸿165
发布于 2017/03/29 10:55
字数 839
阅读 7
收藏 0

#####一、Block内存管理(ARC)

    block : 是不是一个对象? 是(苹果说的)
    如何判断当前文件是MRC , 还是ARC    
    1.dealloc 能否调用super,只有MRC才可以调用super
    2.能否使用retain,relese,如果能用就是MRC
 
    ARC管理原则 : 只要一个对象没有被强指针修饰 就会被销毁,默认局部变量对象都是强指针,存放到堆里面
    MRC了解开发常识 : 1.MRC没有strong weak, 局部变量对象就是相当于基本数据类型(放到栈里面去管理的)
                    2.给成员属性赋值,一定要使用set方法,不能直接访问下划线成员属性赋值
    默认情况下 : block没有使用任何变量. 放到全局区里面. <__NSGlobalBlock__: 0x105be10a0>
    MRC : 管理block
          只要block引用外部局部变量,block放到栈里面.
          block只能使用copy,不能使用retain,使用retain,block还是在栈里面
 
    ARC : 管理block
          只要block引用外部局部变量,block放到堆里面. <__NSMallocBlock__: 0x610000240870>
          block使用strong,最好不要使用copy

  • 1.在ARC管理下Block的内存存储位置
默认跟MRC是一样,存储在全局区

如果访问外部局部变量,存储到堆区里面.
因为ARC变量都是强指针(都是存放到堆里面的)

  • 2.为什么在ARC下block不使用copy :
  1. 使用strong 和 copy 都是一样的 2.使用copy (降低性能) 3.setter方法内存会进行处理很多事情 :(copy会做很多事情的 (会去检查 要不要分配内存,是可变还是不可变) // 如果是可变就会分配内存,如果是不可变就不需要分配内存)
/** 之前说字符串要使用copy,其实是没有意义的 */
// 浅拷贝
@property (nonatomic,copy) NSString *name;
/**
 self.name = @"123";
 不可变给不可变传值 
 不会分配新的内存空间
 所以使用strong 和 copy 都是一样的
 所以是没有意义的
 为什么不要使用copy (降低性能)
 因为copy的setter方法
 - (void)setName:(NSString *)name
 {
 _name = [name copy]; // copy会做很多事情的 (会去检查 要不要分配内存,是可变还是不可变) // 如果是可变就会分配内存,如果是不可变就不需要分配内存
 }


 
 strong
 _name = name;  // strong
 */

code

#import "ViewController.h"

@interface ViewController ()
@property (nonatomic,strong) void(^block)();
/** 之前说字符串要使用copy,其实是没有意义的 */
// 浅拷贝
@property (nonatomic,copy) NSString *name;
/**
 self.name = @"123";
 不可变给不可变传值 
 不会分配新的内存空间
 所以使用strong 和 copy 都是一样的
 所以是没有意义的
 为什么不要使用copy (降低性能)
 因为copy的setter方法
 - (void)setName:(NSString *)name
 {
 _name = [name copy]; // copy会做很多事情的 (会去检查 要不要分配内存,是可变还是不可变) // 如果是可变就会分配内存,如果是不可变就不需要分配内存
 }


 
 strong
 _name = name;  // strong
 */
@end



@implementation ViewController

- (void)setName:(NSString *)name
{
//    _name = name;  // strong
    _name = [name copy]; // copy会做很多事情的
}

- (void)viewDidLoad {
    
    [super viewDidLoad];
    int a = 3;  // ARC(变量都是强指针(都是存放到堆里面)) : 存放到堆里面<__NSMallocBlock__: 0x610000240870>
    void(^block)() = ^{
        NSLog(@"调用了block %d",a); // <__NSGlobalBlock__: 0x105be10a0>
    };
    
    _block = block;
    NSLog(@"%@",block);
}



- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    _block(); // 坏内存访问
    
}


@end

© 著作权归作者所有

宇鸿165
粉丝 1
博文 919
码字总数 368963
作品 0
广州
私信 提问
IOS开发ARC内存管理技术要点

iOS开发ARC内存管理技术要点 本文来源于我个人的ARC学习笔记,旨在通过简明扼要的方式总结出iOS开发中ARC(Automatic Reference Counting,自动引用计数)内存管理技术的要点,所以不会涉及全部...

泊竹
2015/02/16
406
1
iOS中结合代码看内存管理(一)

阅读本文前,建议移步先去了解下内存管理相关知识。 1: iOS内存管理机制(百度goole大法可以获得很多推荐)。 2: iOS中的动态内存分配 3: 堆栈的原理:堆栈 百科 1:自动释放池的常见问题: ...

Nlinger
2017/06/07
0
0
【iOS】__block和__weak内存管理,防止内存泄露

环境:block函数内先写结论:在MRC下,我们通常使用block,而在ARC下我们通常使用weak, 或者unsafeunretaine _block(不安全,不建议使用) 来修饰对象防止循环引用而造成的内存泄露。 注意:...

ONEPIECE_iOS
2016/03/22
548
0
ios开发之block的使用,及注意事项

Block作为C语言的扩展,并不是高新技术,和其他语言的闭包或lambda表达式是一回事。需要注意的是由于Objective-C在iOS中不支持GC机制,使用Block必须自己管理内存,而内存管理正是使用Block...

HillYoung
2015/03/23
9.1K
3
iOS:Block __block修饰符

block修饰符 上一篇文章中说过,auto类型的局部变量,可以被block捕获,但是不能修改值。 block可以解决block内部无法修改外部auto变量的问题。 用法就是这么简单,这样我们修改age为20的时候...

Sunxb
04/07
0
0

没有更多内容

加载失败,请刷新页面

加载更多

只需一步,在Spring Boot中统一Restful API返回值格式与统一处理异常

统一返回值 在前后端分离大行其道的今天,有一个统一的返回值格式不仅能使我们的接口看起来更漂亮,而且还可以使前端可以统一处理很多东西,避免很多问题的产生。 比较通用的返回值格式如下:...

晓月寒丶
昨天
59
0
区块链应用到供应链上的好处和实际案例

区块链可以解决供应链中的很多问题,例如记录以及追踪产品。那么使用区块链应用到各产品供应链上到底有什么好处?猎头悬赏平台解优人才网小编给大家做个简单的分享: 使用区块链的最突出的优...

猎头悬赏平台
昨天
28
0
全世界到底有多少软件开发人员?

埃文斯数据公司(Evans Data Corporation) 2019 最新的统计数据(原文)显示,2018 年全球共有 2300 万软件开发人员,预计到 2019 年底这个数字将达到 2640万,到 2023 年达到 2770万。 而来自...

红薯
昨天
65
0
Go 语言基础—— 通道(channel)

通过通信来共享内存(Java是通过共享内存来通信的) 定义 func service() string {time.Sleep(time.Millisecond * 50)return "Done"}func AsyncService() chan string {retCh := mak......

刘一草
昨天
58
0
Apache Flink 零基础入门(一):基础概念解析

Apache Flink 的定义、架构及原理 Apache Flink 是一个分布式大数据处理引擎,可对有限数据流和无限数据流进行有状态或无状态的计算,能够部署在各种集群环境,对各种规模大小的数据进行快速...

Vincent-Duan
昨天
60
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部