我正在从 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
through属性,book
但这不会创建ARC 保留循环,因为book
属性是weak
。
但是,如果 API 给了我Author
第一个,并且我下载了它Book
,那么一旦我设置它的方法返回,该对象就会被释放,因为相同的属性是weak
.
我想到了几种解决方法:
- 创建一个
Content
同时存储两者的对象(对于多对多关系不可行) - 创建单独的
strongBook
和weakBook
属性,然后创建一个readonly
名为book
which 检查设置并返回该属性的属性
尽管第二种选择更可取,但对我来说,这两种方法似乎都很混乱。
有没有办法使用 Objective-C 运行时动态地将属性从weak
to更改为strong
(反之亦然)?
更新:我收到了一些关于如何解决这个问题的建议,我自己想不出这些建议。这个问题特别是关于是否有一种方法可以(a)为类的特定实例动态重新定义@properties,或者(b)在特定情况下覆盖ARC的retain
/release
行为(因为这个问题在MRC中不存在)。