【block第二篇】对象类型auto变量的Capture

2018-12-28  本文已影响3人  xxxxxxxxx_ios

1.栈上block

将不会对auto变量产生强引用,因为block自己都会随时被回收,所以不会对auto对象产生引用。

#import <UIKit/UIKit.h>
#import "AppDelegate.h"
#import "YMPerson.h"


int main(int argc, char * argv[]) {
    @autoreleasepool {
        
        {
            YMPerson *person = [[YMPerson alloc] init];
            person.age = 10;
            // 此block为栈区block 不会对person对象产生引用。
            ^ {
                NSLog(@"age == %d",person.age);
            };
        }
        
        
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}

2.堆上block(NSStackBlock调用copy)

会调用block内部的copy函数,copy函数内部会调用_Block_object_assign函数, _Block_object_assign函数会根据auto变量的修饰符(__strong、__weak、__unsafe_unretained)做出相应的操作,形成强引用(retain)或者弱引用.

#import <UIKit/UIKit.h>
#import "AppDelegate.h"
#import "YMPerson.h"
typedef void(^YMBlock)(void);

int main(int argc, char * argv[]) {
    @autoreleasepool {
        
        YMBlock block;
        {
            YMPerson *person = [[YMPerson alloc] init];
            person.age = 10;
            // 此block有强指针引用,会堆区block,所以会对其中的person对象有一个强引用(person对象默认为__strong类型),当用__weak、__unsafe_unretained修饰时,会对应的为弱引用
            block = ^ {
                
                NSLog(@"age = %d",person.age);
            };
        }
        NSLog(@"%@",[block class]);
        
        
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}

3.block从堆空间移除

会调用block内部的dispose函数,dispose函数内部会调用_Block_object_dispose函数, _Block_object_dispose函数会自动释放引用的auto变量(release).

上一篇下一篇

猜你喜欢

热点阅读