gpt4 book ai didi

objective-c - 阻止自动保留,它甚至影响到自己的ivars吗?

转载 作者:太空狗 更新时间:2023-10-30 03:59:08 26 4
gpt4 key购买 nike

如果我有课:

@interface A : NSObject
{
BOOL b;
id c;
}
@end

并在 block 中引用bc, block 是否自动保留self?或者只是 bc?关于c,它本身可能会被保留,但是b呢?

最佳答案

比尔的回答不太正确:

如果您有一个 A 的实例并在该实例中创建一个 block ,如下所示:

^{
b = YES;
}

然后 self 被保留(当 block 被复制时)。 b 不是 const-copied,因为bself 强引用,并且只有 self 是 block 范围内的 const

另一方面,如果您这样做:

BOOL aBool = YES;
^{
aBool = NO;
c = [[NSObject alloc] init];
}

然后,selfconst 复制的(并在 block 本身被复制时保留)并且允许分配给 c。但是,aBOOL 的赋值是不允许的,因为aBool 的值是const 复制的。

换句话说,编译器将bc识别为ivars,并会直接保留self而不是ivars。


一种有助于我理解正在发生的事情的思考方法是记住对象实际上只是一个奇特的结构,这意味着您可以通过箭头运算符在技术上访问 ivars:->

因此,当您访问 ivars 时:

b = YES;

等同于:

self->b = YES;

从这个角度来看,为什么您必须保留 self,但 b 不是 const。这是因为 b 只是“大局”的一小部分,为了得到 b,你必须包含所有的 self同样(因为复制结构的一部分在这种情况下并没有真正意义)。

关于objective-c - 阻止自动保留,它甚至影响到自己的ivars吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5807022/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com