//
// main.m
// 01-block原理
//
// Created by 杨俊飞 on 15/6/4.
// Copyright (c) 2015年 杨俊飞. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "Student.h"
/**
1> block 的本质:指向结构体的指针
2> 使用命令: clang -rewrite-objc main.m 可以把OC代码转成 CPP代码
然后查看转化后的C代码、分析block 的原理。
*/
int b = 20;
void test1(){
__block int a = 10;
void (^b1)() = ^{
a = 20;
b = 30;
};
NSLog(@"%d",a);
NSLog(@"%d",b);
b1();
NSLog(@"%d",a);
NSLog(@"%d",b);
}
/** block 陷阱1 */
void test2(){
Student * s1 = [[Student alloc] init];
s1.copy_block = ^{
NSLog(@"block run---");
s1.age =10; //该行代码会导致 s1 无法释放、导致内存泄漏
};
s1.copy_block();
}
void test3(){
Student * s1 = [[Student alloc] init];
__unsafe_unretained Student * s2 = s1; // <==> __weak Student * s2 = s1;
s1.copy_block = ^{
NSLog(@"block run---");
s2.age = 10;
};
s1.copy_block();
}
/** block 陷阱2 */
void test4(){
/** block 默认是在栈内存中 copy以后就会新生成一份放在堆内存中 */
void (^myblock)() = ^{
NSLog(@"-----");
};
[myblock copy];// <==> Block_copy(myblock);
}
void test5(){
Student * s1 = [[Student alloc] init];
s1.assign_block = ^{
NSLog(@"block run---");
s1.age =10;
};
s1.assign_block();
}
int main(int argc, const char * argv[])
{
@autoreleasepool {
// test1();
// test2();
// test3();
// test4();
test5();
}
return 0;
}