我正在阅读关于Objective-C参考周期的Apple文档,然后我尝试创建一个,但我不太明白它的行为。这就是我所拥有的:有两个类XYZPerson
和XYZPersonSpouse
。
它们的名字,姓氏和属性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
方法,以在控制台上打印一些文本。现在,因为我没有使用weak
或unsafe_unretained
,而在两个类上定义属性spouseName
,我假设通过上面的代码我创建了一个强大的引用循环。但是,稍后我将另一个NSString
指定为XYZPerson
类的实例person
,如下所示:
person.spouseName = @"Julia";
(但即使没有这个)并运行我的项目,我仍然会看到dealloc
类的XYZPersonSpouse
方法的消息(以及XYZPerson
类的消息)。
由于参考周期,不应该仍然保留这些类吗? 如果你能解释一下这里发生了什么,我将非常感谢你的帮助。
答案 0 :(得分:3)
您没有看到参考/保留周期,因为这不是参考周期。
在您的示例中,person
和spouseOfPerson
是具有指向其字符串属性firstName
和spouseName
的强指针的对象。 这些人物对象没有强烈的指针,他们有很强的指向字符串的指针。由于字符串不具有对人物对象的强引用,因此不会创建周期
如果要创建引用循环,则需要对象本身具有相互之间的强指针。为此,您需要声明以下属性:
XYZPerson
@property (nonatomic, strong) XYZPersonSpouse *spouse
XYZPersonSpouse
@property (nonatomic, strong) XYZPerson *spouse
如果您执行以下操作而不是设置名称的两行,您将有一个参考周期。
spouseOfXYZPerson.spouse = person;
person.spouse = spouseOfXYZPerson;
要中断参考周期,请将spouse
属性更改为weak
。