MacOS开发 技术集锦iOS开发 技术集锦

Block 内存管理(MRC)

2018-07-03  本文已影响11人  cjdale

在说Block内存管理之前,先提个问题,Block是不是一个对象?

Block是一个对象

为什么呢?苹果官方文档给出了答案

image1
具体解释链接https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/WorkingwithBlocks/WorkingwithBlocks.html
Block内存管理分为MRC何ARC, 此篇文章介绍Block在MRC环境下的内存管理。

言归正传,下面介绍MRC环境下Block的内存管理。

1、新建工程,默认ARC环境,设置为MRC环境。

Image2.png

2、定义一个block

打印结果为:

    <__NSGlobalBlock__: 0x106350088>

由此可以看出此时Block放在全局区

打印结果为:

    <__NSStackBlock__: 0x7ffee143fa28>

由此可以看出此时Block放在栈区

打印结果为:

    <__NSGlobalBlock__: 0x10136b070>

由此可以看出此时Block放在全局区

打印结果为:

    <__NSGlobalBlock__: 0x104905070>

由此可以看出此时Block放在全局区

3、定义属性保存Block

@property (nonatomic, retain) void(^block)(void);

int a = 0;
void(^block)(void) = ^{
    NSLog(@"%d", a);
};
self.block = block;
NSLog(@"%@", self.block);

打印结果为:

<__NSStackBlock__: 0x7ffeedd1da28>

此时再去访问self.block, 就会出现崩溃


image3.png

使用retain修饰block,此时block还在栈里

总结

只要block没有引用外部局部变量,block放在全局区
只要Block引用外部局部变量,block放在栈里面.
block只能使用copy,不能使用retain

上一篇 下一篇

猜你喜欢

热点阅读