• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

ios - 试图理解引用周期

[复制链接]
菜鸟教程小白 发表于 2022-12-12 14:31:51 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我正在阅读 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,也是)。

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



Best Answer-推荐答案


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

在您的示例中,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/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap