08-Block

2019-03-11  本文已影响0人  weyan

一、block本质:

二、变量捕获

auto :自动变量(局部变量),离开作用域就会销毁。 (我们声明的变量 auto int age=10默认前面有一个关键字auto)

1、auto变量捕获

变量捕获C++源码分析:

1 2 3 4

2、static变量捕获

C++源码分析

3、全局变量不捕获,直接根据地址使用

C++源码分析:

总结:

三、block的类型

四、在ARC环境下会对block自动进行copy操作的几种情况

五、对象类型的auto变量

栈空间的block不会保住对象类型auto变量的命,如果是堆空间的block会保住对象类型auto变量的命。


源码分析:

源码分析:

六、block修改变量

证明如下:被__block修饰的age是__Block_byref_a_0对象的成员变量age

验证被__block修饰的age就是被包装成对象成员变量的age

第二种方法:


#import <Foundation/Foundation.h>

typedef void (^MJBlock) (void);

struct __Block_byref_age_0 {
    void *__isa;
    struct __Block_byref_age_0 *__forwarding;
    int __flags;
    int __size;
    int age;
};

struct __main_block_desc_0 {
    size_t reserved;
    size_t Block_size;
    void (*copy)(void);
    void (*dispose)(void);
};

struct __block_impl {
    void *isa;
    int Flags;
    int Reserved;
    void *FuncPtr;
};

struct __main_block_impl_0 {
    struct __block_impl impl;
    struct __main_block_desc_0* Desc;
    struct __Block_byref_age_0 *age;
};

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        
        __block int age = 10;
        
        MJBlock block = ^{
            age = 20;
            NSLog(@"age is %d", age);
        };
        
        struct __main_block_impl_0 *blockImpl = (__bridge struct __main_block_impl_0 *)block;
        
        NSLog(@"%p", &age);
    }
    return 0;
}

七、__block的内存管理

八、__block修饰的对象类型

C++源码分析:

八、block的循环引用

上一篇 下一篇

猜你喜欢

热点阅读