我从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
,那么一旦我设置它的方法返回,该对象将被释放,因为相同的属性是{{ 1}}。
我想到了几个方法:
weak
对象(对多对多关系不可行)Content
和strongBook
属性,然后创建一个名为weakBook
的{{1}}属性,用于检查已设置的属性并返回该属性这些对我来说都很麻烦,虽然第二种选择更可取。
有没有办法使用Objective-C运行时动态地将属性从readonly
更改为book
(反之亦然)?
更新:我正在就如何解决这个问题提出一些建议,我自己也没有遇到任何问题。这个问题具体是关于是否有办法(a)为特定的类实例动态重新定义@properties,或者(b)在特定情况下覆盖ARC的weak
/ strong
行为(从这个问题在MRC中不存在。)
答案 0 :(得分:1)
只是在黑暗中拍摄,但您可以创建属性而不指定,然后使用动态与运行时apis。我没有测试它,但我认为它应该工作:
//.h file
#import <Foundation/Foundation.h>
@interface SomeObject : NSObject
@property(nonatomic) NSObject *object;
@end
//.m file
#import "SomeObject.h"
#import <objc/runtime.h>
@implementation SomeObject
@dynamic object;
-(void)setObject:(NSObject *)object
{
BOOL isWeak = NO;
if(isWeak)
{
objc_setAssociatedObject(self, "object", object, OBJC_ASSOCIATION_ASSIGN);
}
else
{
objc_setAssociatedObject(self, "object", object, OBJC_ASSOCIATION_RETAIN);
}
}
-(NSObject *)object
{
return objc_getAssociatedObject(self, "object");
}
@end
答案 1 :(得分:0)
在下载期间,创建一个可变字典,以临时存储在本书之前到达的作者对象。收到一本书后,查看该数组并查看作者信息是否存在,如果有,请附上。当你完成清理可变数组时。