【发布时间】:2013-06-06 19:52:34
【问题描述】:
我正在从 API 下载对象列表以显示给用户。该列表混合了两种类型的对象。想象一下,它们是书籍和作者的组合,类定义如下所示:
@interface Book : NSObject
@property (nonatomic, strong) NSString *title;
@property (nonatomic, strong) Author *author;
@end
@interface Author : NSObject
@property (nonatomic, strong) NSString *fullName;
@property (nonatomic, weak) Book *book;
@end
每个Book 都可以从API 下载其Author 信息,反之亦然。
如果 API 给我一个Book,我可以在下载它后设置它的author 属性。 Author 对象通过book 属性指向Book,但这不会创建ARC Retain Cycle,因为book 属性是weak。
但是,如果 API 先给我一个Author,然后我下载它的Book,那么一旦我设置它的方法返回,该对象就会被释放,因为相同的属性是weak。
我想了几个办法解决这个问题:
- 创建一个存储两者的
Content对象(不适用于多对多关系) - 创建单独的
strongBook和weakBook属性,然后创建一个名为book的readonly属性,该属性检查哪个设置并返回那个
这两个对我来说似乎都很乱,虽然第二个选项更可取。
有没有办法使用 Objective-C 运行时将属性从 weak 动态更改为 strong(反之亦然)?
更新:我收到了一些关于如何解决该问题的建议,我自己想出这些建议并不困难。这个问题具体是关于是否有办法(a)为类的特定实例动态重新定义@properties,或(b)在特定情况下覆盖ARC的retain/release行为(因为这个问题不会' t 存在于 MRC 中)。
【问题讨论】:
-
修复您的 API 定义。就是这么简单。
-
为什么不让它们都变弱,然后保留所有书籍和作者的 NSArray 以保留它们?
-
@RichardJ.RossIII 是的,但在这种情况下我需要解决它。
-
@EricS 这可以工作,但是当我想删除一个项目时,我还有另一个维护点。
-
作者要弱,书要强,反之不行。因此,如果一本书只有一个作者,则保留 1 次。你这样做的方式一个作者被保留 N 次。
标签: ios objective-c macos properties objective-c-runtime