试图理解参考周期
Trying to understand the reference cycle
我正在阅读 Apple 关于 Objective-C 的参考循环的文档,然后我尝试创建一个,但我不太理解它的行为。这是我所拥有的:有两个 classes XYZPerson
和 XYZPersonSpouse
。
他们有名字、姓氏的属性和名为 spouseName
的 NSString
类型的属性。在 main
中,我将两个 class 的 spouseName
属性设置为彼此的名称(在两个 class 的 init
中,我称它们为 designated initializers
, 设置他们的名字和姓氏):
XYZPerson *person = [[XYZPerson alloc] init];
XYZPersonSpouse *spouseOfXYZPerson = [[XYZPersonSpouse alloc] init];
spouseOfXYZPerson.spouseName = person.firstName;
person.spouseName = spouseOfXYZPerson.firstName;
我还覆盖了两个 class 的 dealloc
方法以在控制台上打印一些文本。现在,因为我不使用 weak
或 unsafe_unretained
,同时在两个 classes 上定义属性 spouseName
,我假设通过上面的代码我创建了一个强引用循环.但是,稍后我将另一个 NSString
指定为 XYZPerson
class 的实例 person
的名称,如下所示:
person.spouseName = @"Julia";
(但即使没有这个)和 运行 我的项目,我一直看到 XYZPersonSpouse
class 的 dealloc
方法的消息(以及 XYZPerson
, 也是).
因为引用循环,classes不应该还是不保留吗?
如果你能解释一下这里发生了什么,我将不胜感激。
您没有看到 reference/retain 循环,因为这不是引用循环。
在您的示例中,person
和 spouseOfPerson
是具有指向其字符串属性 firstName
和 spouseName
的强指针的对象。 这些人对象之间没有强指针,它们有指向字符串的强指针。由于字符串没有对人对象的强引用,因此不会创建循环。
如果要创建引用循环,则需要对象本身具有相互指向的强指针。为此,您需要声明以下属性:
XYZPerson
@property (nonatomic, strong) XYZPersonSpouse *spouse
XYZPersonSpouse
@property (nonatomic, strong) XYZPerson *spouse
如果您随后执行以下操作而不是设置名称的两行,您将有一个引用循环。
spouseOfXYZPerson.spouse = person;
person.spouse = spouseOfXYZPerson;
要打破引用循环,请将 spouse
属性 更改为 weak
。
我正在阅读 Apple 关于 Objective-C 的参考循环的文档,然后我尝试创建一个,但我不太理解它的行为。这是我所拥有的:有两个 classes XYZPerson
和 XYZPersonSpouse
。
他们有名字、姓氏的属性和名为 spouseName
的 NSString
类型的属性。在 main
中,我将两个 class 的 spouseName
属性设置为彼此的名称(在两个 class 的 init
中,我称它们为 designated initializers
, 设置他们的名字和姓氏):
XYZPerson *person = [[XYZPerson alloc] init];
XYZPersonSpouse *spouseOfXYZPerson = [[XYZPersonSpouse alloc] init];
spouseOfXYZPerson.spouseName = person.firstName;
person.spouseName = spouseOfXYZPerson.firstName;
我还覆盖了两个 class 的 dealloc
方法以在控制台上打印一些文本。现在,因为我不使用 weak
或 unsafe_unretained
,同时在两个 classes 上定义属性 spouseName
,我假设通过上面的代码我创建了一个强引用循环.但是,稍后我将另一个 NSString
指定为 XYZPerson
class 的实例 person
的名称,如下所示:
person.spouseName = @"Julia";
(但即使没有这个)和 运行 我的项目,我一直看到 XYZPersonSpouse
class 的 dealloc
方法的消息(以及 XYZPerson
, 也是).
因为引用循环,classes不应该还是不保留吗? 如果你能解释一下这里发生了什么,我将不胜感激。
您没有看到 reference/retain 循环,因为这不是引用循环。
在您的示例中,person
和 spouseOfPerson
是具有指向其字符串属性 firstName
和 spouseName
的强指针的对象。 这些人对象之间没有强指针,它们有指向字符串的强指针。由于字符串没有对人对象的强引用,因此不会创建循环。
如果要创建引用循环,则需要对象本身具有相互指向的强指针。为此,您需要声明以下属性:
XYZPerson
@property (nonatomic, strong) XYZPersonSpouse *spouse
XYZPersonSpouse
@property (nonatomic, strong) XYZPerson *spouse
如果您随后执行以下操作而不是设置名称的两行,您将有一个引用循环。
spouseOfXYZPerson.spouse = person;
person.spouse = spouseOfXYZPerson;
要打破引用循环,请将 spouse
属性 更改为 weak
。