其他分享
首页 > 其他分享> > iOS开发:Blocks探究——基本用法

iOS开发:Blocks探究——基本用法

作者:互联网

文章目录

Block是什么


Block的语法

Block的语法格式

Block类型的声明与赋值的使用

Block与一般的C语言变量相似的使用

Block类型变量与一般的C语言变量完全相同,可以作为自动变量,函数参数,静态变量,全局变量使用。比如将块定义在main函数外部,就可以将它扩展到全局范围。

Block在OC中的使用

作为 typedef 声明类型


Block截取变量

Blocks 变量的循环引用以及如何避免

我们知道 Block 会对引用的局部变量进行持有。同样,如果 Block 也会对引用的对象进行持有,从而会导致相互持有,引起循环引用。

/* —————— retainCycleBlcok.m —————— */   
#import <Foundation/Foundation.h>
#import "Person.h"
int main() {
    Person *person = [[Person alloc] init];
    person.blk = ^{
        NSLog(@"%@",person);
    };

    return 0;
}


/* —————— Person.h —————— */ 
#import <Foundation/Foundation.h>

typedef void(^myBlock)(void);

@interface Person : NSObject
@property (nonatomic, copy) myBlock blk;
@end


/* —————— Person.m —————— */ 
#import "Person.h"

@implementation Person    

@end

上面 retainCycleBlcok.mmain() 函数的代码会导致一个问题:person 持有成员变量 myBlock blk,而 blk 也同时持有成员变量 person,两者互相引用,永远无法释放。就造成了循环引用问题。

那么,如何来解决这个问题呢?

ARC 下,通过 __weak 修饰符来消除循环引用

在 ARC 下,可声明附有 __weak 修饰符的变量,并将对象赋值使用。

int main() {
    Person *person = [[Person alloc] init];
    __weak typeof(person) weakPerson = person;

    person.blk = ^{
        NSLog(@"%@",weakPerson);
    };

    return 0;
}

这样,通过 __weak,person 持有成员变量 myBlock blk,而 blk 对 person 进行弱引用,从而就消除了循环引用。

MRC 下,通过 __block 修饰符来消除循环引用

MRC 下,是不支持 weak 修饰符的。但是我们可以通过 block 来消除循环引用。

int main() {
    Person *person = [[Person alloc] init];
    __block typeof(person) blockPerson = person;

    person.blk = ^{
        NSLog(@"%@", blockPerson);
    };

    return 0;
}

通过 __block 引用的 blockPerson,是通过指针的方式来访问 person,而没有对 person 进行强引用,所以不会造成循环引用。

标签:Blocks,变量,int,iOS,person,探究,Block,blk,block
来源: https://blog.csdn.net/qq_42347755/article/details/100830133