试图了解参考周期

时间:2018-02-02 22:39:38

标签: ios objective-c retain-cycle

我正在阅读关于Objective-C参考周期的Apple文档,然后我尝试创建一个,但我不太明白它的行为。这就是我所拥有的:有两个类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";

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

由于参考周期,不应该仍然保留这些类吗? 如果你能解释一下这里发生了什么,我将非常感谢你的帮助。

1 个答案:

答案 0 :(得分:3)

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

在您的示例中,personspouseOfPerson是具有指向其字符串属性firstNamespouseName的强指针的对象。 这些人物对象没有强烈的指针,他们有很强的指向字符串的指针。由于字符串不具有对人物对象的强引用,因此不会创建周期

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

XYZPerson
@property (nonatomic, strong) XYZPersonSpouse *spouse

XYZPersonSpouse
@property (nonatomic, strong) XYZPerson *spouse

如果您执行以下操作而不是设置名称的两行,您将有一个参考周期。

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

要中断参考周期,请将spouse属性更改为weak