在通读文章之前,您可能需要了解内存分配的基础知识。
默认情况下,block是存档在栈中,可能被随时回收,通过copy操作可以使其在堆中保留一份, 相当于一直强引用着, 因此如果block中用到self时, 需要将其弱化, 通过__weak或者__unsafe_unretained. 以下是示例代码及其说明, 读者可以试着打印出不同情况下block的内存情况
当函数内部代码结束时,函数中的所有存储在栈区的变量都会被系统释放, 因此如果属性的block是用assign修饰时 当再次访问时就会出现野指针访问.
- #import "ViewController.h"
-
- @interface ViewController ()
- @property (nonatomic, copy) void(^myblock)();
-
- @end
-
- @implementation ViewController
-
- - (void)viewDidLoad {
- [super viewDidLoad];
-
-
- void(^myBlock1)() = ^() {
- NSLog(@"我是老大");
- };
- NSLog(@"%@",myBlock1);
-
-
-
-
-
- int n = 5;
- void(^myBlock2)() = ^() {
- NSLog(@"我是老二%d", n);
- };
- NSLog(@"%@", myBlock2);
-
-
-
- void(^myBlock3)() = ^() {
- NSLog(@"我是老二%d", n);
- };
- NSLog(@"%@", [myBlock3 copy]);
-
-
-
-
-
-
-
-
- [self test];
- self.myblock();
- }
-
- - (void)test {
- int n = 5;
- [self setMyblock:^{
- NSLog(@"%d",n);
- }];
- NSLog(@"test--%@",self.myblock);
- }
-
- @end
转自:http://blog.csdn.net/wangjunling888/article/details/51388517