美文网首页
Block, __weak, __block, __strong

Block, __weak, __block, __strong

作者: yytmzys | 来源:发表于2023-05-16 22:29 被阅读0次

__weak

用于修饰一个OC对象的弱引用。当被修饰的对象没有其他强引用时,__weak 修饰的引用会自动被设置为 nil,避免循环引用的问题。

__weak 主要用于修饰那些你希望创建弱引用的对象,以避免循环引用。在 Objective-C 中,循环引用可能会导致内存泄漏,而使用 __weak 可以避免循环引用,确保对象在不再被其他强引用持有时能够被正确释放。

以下是一个示例代码,展示了如何使用 __weak 修饰符修饰一个对象的指针:

__weak MyClass *weakObject = someObject;

在上述代码中,weakObject 是一个被 __weak 修饰的指向 MyClass 类型对象的指针。它是一个弱引用,当 someObject 不再被其他强引用持有时,weakObject 会自动被设置为 nil。

需要注意的是,__weak 仅适用于 Objective-C 对象类型
不适用于非对象类型(如基本数据类型, 即值类型如 int、float、BOOL 等, 因为它们不是对象类型,而是直接存储在栈上的数据 )或 C 结构体。。

__block

用于修饰在 block 内部被访问的外部变量,使其在 block 内部可以被修改。通常在需要在 block 内部修改外部变量时使用。

__block int count = 0;

void (^block)(void) = ^{
    count++;
    NSLog(@"Count: %d", count);
};

block();

在上述代码中,我们使用 __block 修饰符修饰了 count 变量,使其可以在 block 内部被修改。通过调用 block(),我们增加了 count 的值,并输出结果。

需要注意的是,__block 修饰符主要用于在 block 内部修改外部变量的值,而不是仅仅访问变量的值。它使得在 block 内部可以改变变量的值,而不会创建一个新的局部变量。

__strong

__strong 用于修饰一个对象的强引用。这是默认的引用修饰词,表示对对象的强引用,使对象在被使用时不会被提前释放。
这些修饰词在内存管理和闭包(Blocks)的使用中起着重要的作用,能够帮助我们正确地管理对象的引用和解决循环引用的问题。

__strong 修饰词通常不是必需的,因为它是默认的引用修饰方式。在 Objective-C 中,所有对象类型的指针默认都是强引用,即使用 id 类型或其他 Objective-C 类型的指针时,默认情况下就是强引用。

因此,你不需要显式地使用 __strong 来修饰对象类型,除非你希望显式地强调引用的类型。在大多数情况下,不使用 __strong 修饰词也是可以的。

需要注意的是,__strong 修饰词不适用于非对象类型,例如基本数据类型(int、float、BOOL 等)或 C 结构体。它仅适用于 Objective-C 对象类型。

相关文章

网友评论

      本文标题:Block, __weak, __block, __strong

      本文链接:https://www.haomeiwen.com/subject/rhxbsdtx.html