【问题标题】:Trying to understand the reference cycle试图理解参考周期
【发布时间】:2018-07-13 11:58:18
【问题描述】:

我正在阅读 Apple 关于 Objective-C 参考周期的文档,然后我尝试创建一个,但我不太了解它的行为。这就是我所拥有的:有两个类XYZPersonXYZPersonSpouse。 他们的名字、姓氏和类型为NSString 的属性称为spouseName。在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)。

不应该因为引用循环而仍然不保留类吗? 如果你能解释一下这里发生了什么,我会很感激你的帮助。

【问题讨论】:

  • 仅供参考 - 现代(后 ARC)术语是“参考周期”,而不是“保留周期”。
  • @rmaddy,谢谢你的观察,我会改问题

标签: ios objective-c retain-cycle


【解决方案1】:

您没有看到参考/保留周期,因为这不是参考周期。

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

如果你想创建一个引用循环,你需要对象本身有相互之间的强指针。为此,您需要声明以下属性:

XYZPerson
@property (nonatomic, strong) XYZPersonSpouse *spouse

XYZPersonSpouse
@property (nonatomic, strong) XYZPerson *spouse

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

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

要中断引用循环,请将spouse 属性更改为weak

【讨论】:

  • 非常感谢您的说明。现在我明白了!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多