block 实现原理(内存管理详解)
2015-03-12 15:32
846 查看
在以前,MRC环境下,使用block很可能会出现内存泄漏问题,并且在以往的面试中,一些接触比较久的程序员都会喜欢问到这个问题,block内存泄漏的问题!
下面,我来介绍一下,MRC下Block内存泄漏的一个问题
先随意创建一个Dog类,并创建int类型age属性,
然后在main函数中,创建下列代码,
int main(int argc, const char * argv[])
{
}
这个时候是正常情况,但是,如果添加如下第10行代码:
int main(int argc, const char * argv[])
{
}
此时此刻,有人想对block进行release,但是不管你是否对block进行release ,都无法释放d对象。为什么呢??
这个时候,我们就要对block进行分析了:
1.默认情况下, block的内存是在栈中
2.如果对block做一次copy操作, block的内存就会在堆中
所以,只需要在Dog类前面加上__block即可!
转载自:http://my.oschina.net/panyong/blog/304134
下面,我来介绍一下,MRC下Block内存泄漏的一个问题
先随意创建一个Dog类,并创建int类型age属性,
然后在main函数中,创建下列代码,
import “Dog.h”
int main(int argc, const char * argv[]){
@autoreleasepool { Dog *d = [[Dog alloc] init]; d.age = 20 ; void(^block)() = ^{ NSLog(@"%d",d.age); }; block(); [d release]; }
}
这个时候是正常情况,但是,如果添加如下第10行代码:
int main(int argc, const char * argv[])
{
@autoreleasepool { Dog *d = [[Dog alloc] init]; d.age = 20 ; void(^block)() = ^{ NSLog(@"%d",d.age); }; Block_copy(block); block(); [d release]; }
}
此时此刻,有人想对block进行release,但是不管你是否对block进行release ,都无法释放d对象。为什么呢??
这个时候,我们就要对block进行分析了:
1.默认情况下, block的内存是在栈中
* 它不会对所引用的对象进行任何操作
2.如果对block做一次copy操作, block的内存就会在堆中
* 它会对所引用的对象做一次retain操作 * 非ARC : 如果所引用的对象用了__block修饰, 就不会做retain操作 * ARC : 如果所引用的对象用了__unsafe_unretained\__weak修饰, 就不会做retain操作
所以,只需要在Dog类前面加上__block即可!
转载自:http://my.oschina.net/panyong/blog/304134
相关文章推荐
- block 实现原理和相关内存管理详解
- block 实现原理(内存管理详解)(二)
- block 实现原理(内存管理详解)(二)
- block 实现原理详解
- Spark2.1的内存管理机制及实现原理详解
- block 实现原理详解(一)
- iOS Block底层实现原理详解
- block 实现原理详解(一)
- block实现原理详解
- iPhone/Mac Objective-C内存管理教程和原理剖析(三)@property (retain)和@synthesize的默认实现
- GlusterFS之内存池(mem-pool)实现原理及代码详解
- 初读java源码:详解System.out.print实现原理
- iPhone/Mac Objective-C内存管理教程和原理剖析(三)@property (retain)和@synthesize的默认实现
- GlusterFS之内存池(mem-pool)实现原理及代码详解
- Canny边缘检测算法原理及其VC实现详解(二)
- iPhone/Mac Objective-C内存管理教程和原理剖析(三)@property (retain)和@synthesize的默认实现
- Objective-C 内存管理机制原理与实现详解
- iPhone/Mac Objective-C内存管理教程和原理剖析(三)@property (retain)和@synthesize的默认实现
- Enterprise Library Policy Injection Application Block 之二: PIAB设计和实现原理
- Android 四大组件之(2)Service实现原理以及AIDL语言的使用详解