【block第三篇】__block修饰符

1.__block简介

__block可以用于解决block内部无法修改auto变量值的问题, __block不能修饰全局变量、静态变量(static),编译器会将__block变量(不管是基本数据类型还是对象类型)包装成一个对象。

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

int main(int argc, char * argv[]) {
    @autoreleasepool {
        
        // 基本数据类型
        __block int a = 10;
        YMBlock block = ^{
            a = 20;
        };
        block();
        NSLog(@"a == %d",a);
        
        // 对象类型
        YMPerson *person = [[YMPerson alloc] init];
        person.age = 10;
        __block YMPerson *blockPerson = person;
        YMBlock block1 = ^{
            
            // 这不是修改person对象 是使用person对象 此步骤不使用__block修饰也可
            person.age = 20;
            
            // 修改person对象,必须用__block修饰
            blockPerson = [[YMPerson alloc] init];
            blockPerson.age = 100;
        };
        block1();
        NSLog(@"person.age == %d",person.age);
        NSLog(@"blockPerson.age == %d",blockPerson.age);
        
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}
  • 运行结果


    block修饰

2.__block修饰变量的内存管理

1.当block在栈上时,并不会对__block变量产生强引用。
2.当__block变量被copy到堆时,会调用__block变量内部的copy函数,copy函数内部会调用_Block_object_assign函数,_Block_object_assign函数会根据所指向对象的修饰(__strong、__weak、__unsafe_unretained)做出相应的操作,形成强引用(retain)或者弱引用(注意:这里仅限于ARC时会retain,MRC时不会retain)。
3. 如果__block变量从堆上移除,会调用__block变量内部的dispose函数,dispose函数内部会调用_Block_object_dispose函数,_Block_object_dispose函数会自动释放指向的对象(release)。

3.__block __weak同时修饰

block内部不会对对象进行强引用

#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 __weak YMPerson *blockPerson = person;
            block = ^{
                blockPerson.age = 100;
            };
        }
        block();
        NSLog(@"---");

        
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}
  • 运行结果


    __block __weak 同时修饰
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1 Block机制 (Very Good) Block技巧与底层解析 http://www.jianshu.com...
    Kevin_Junbaozi阅读 9,499评论 3 48
  • 一、Objective-C发展史 Objective-C从1983年诞生,已经走过了30多年的历程。随着时间的推移...
    没事蹦蹦阅读 11,132评论 12 34
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 13,887评论 1 32
  • 之前有记录过如何搭建基于Karma, Jasmine的测试环境, 这段时间陆续也写了不少Angular的单元测试,...
    菲汐阅读 4,463评论 4 2
  • *文章涉及部分剧透,介意者慎读* 这个故事从描述程勇的个人困境开始。 他人到中年,开着一家交不起房租的印度神油店,...
    菜鸡麻麻阅读 2,885评论 0 2

友情链接更多精彩内容