gpt4 book ai didi

ios - 试图理解引用周期

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:53:29 25 4
gpt4 key购买 nike

我正在阅读 Apple 关于 Objective-C 的引用循环的文档,然后我尝试创建一个,但我不太理解它的行为。这是我所拥有的:有两个类 XYZPersonXYZPersonSpouse。他们有名字、姓氏的属性和名为 spouseNameNSString 类型的属性。在 main 中,我将两个类的 spouseName 属性设置为彼此的名称,如下所示(在两个类的 init 中,我调用它们的 designated initializers ,设置他们的名字和姓氏):

 XYZPerson *person = [[XYZPerson alloc] init];
XYZPersonSpouse *spouseOfXYZPerson = [[XYZPersonSpouse alloc] init];


spouseOfXYZPerson.spouseName = person.firstName;
person.spouseName = spouseOfXYZPerson.firstName;

我还重写了两个类的 dealloc 方法以在控制台上打印一些文本。现在,因为我不使用 weakunsafe_unretained,同时在两个类上定义属性 spouseName,我假设通过上面的代码我创建了强大的引用循环。但是,稍后我将另一个 NSString 指定为 XYZPerson 类的实例 person 的名称,如下所示:

 person.spouseName = @"Julia";

(但即使没有这个)并运行我的项目,我一直看到 XYZPersonSpouse 类的 dealloc 方法的消息(以及 XYZPerson,也是)。

因为引用循环,类不应该仍然保留吗?如果您能解释一下这里发生了什么,我将不胜感激。

最佳答案

您没有看到引用/保留循环,因为这不是引用循环。

在您的示例中,personspouseOfPerson 是具有指向其字符串属性 firstNamespouseName 的强指针的对象. 这些人对象之间没有强指针,它们有指向字符串的强指针。由于字符串没有对人对象的强引用,因此不会创建循环。

如果要创建引用循环,则需要对象本身具有相互指向的强指针。为此,您需要声明以下属性:

XYZPerson
@property (nonatomic, strong) XYZPersonSpouse *spouse

XYZPersonSpouse
@property (nonatomic, strong) XYZPerson *spouse

如果您随后执行以下操作而不是设置名称的两行,您将拥有一个引用循环。

spouseOfXYZPerson.spouse = person;
person.spouse = spouseOfXYZPerson;

要打破引用循环,将 spouse 属性更改为 weak

关于ios - 试图理解引用周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48591900/

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