//
// main.m
//
#import <Foundation/Foundation.h>
// block实际上是: 指向结构体的指针
// 编译器会将block的内部代码生成对应的函数
//void __test1_block_func_0()
//{
// NSLog(@"a is %d", 10);
//}
//void test1()
//{
// int a = 10;
//
// void (^block)() = ^{
// NSLog(@"a is %d", a);
// };
//
// a = 20;
//
// block(); // 10
//}
//void test2()
//{
// __block int a = 10;
//
// void (^block)() = ^{
// NSLog(@"a is %d", a);
// };
//
// a = 20;
//
// block(); // 20
//}
//void test3()
//{
// static int a = 10;
//
// void (^block)() = ^{
// NSLog(@"a is %d", a);
// };
//
// a = 20;
//
// block(); // 20
//}
//
//int a = 10;
//void test4()
//{
// void (^block)() = ^{
// NSLog(@"a is %d", a);
// };
//
// a = 20;
//
// block();
//}
#import "Dog.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
// __block Dog *d = [[Dog alloc] init]; // 1
// d.age = 20;
//
// void (^block)() = ^{
// NSLog(@"------block------%d", d.age);
// };
// NSLog(@"%zd", [d retainCount]);
// Block_copy(block); // 2
// NSLog(@"%zd", [d retainCount]);
//
// [d release]; // 1
Dog *d = [[Dog alloc] init]; // 1
// d.block = ^{
// NSLog(@"%d", d.age);
// };
[d release]; // 0
}
return 0;
}
/**
1.默认情况下, block的内存是在栈中
* 它不会对所引用的对象进行任何操作
2.如果对block做一次copy操作, block的内存就会在堆中
* 它会对所引用的对象做一次retain操作
* 非ARC : 如果所引用的对象用了__block修饰, 就不会做retain操作
* ARC : 如果所引用的对象用了__unsafe_unretained\__weak修饰, 就不会做retain操作
*/
block的实现原理
最新推荐文章于 2021-05-22 19:12:44 发布