block的实现原理

//
//  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操作
 */

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值