有条不紊地使@property强或弱

时间:2013-06-06 19:52:35

标签: ios objective-c macos properties objective-c-runtime

我从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对象(对多对多关系不可行)
  • 创建单独的ContentstrongBook属性,然后创建一个名为weakBook的{​​{1}}属性,用于检查已设置的属性并返回该属性

这些对我来说都很麻烦,虽然第二种选择更可取。

有没有办法使用Objective-C运行时动态地将属性从readonly更改为book(反之亦然)?

更新:我正在就如何解决这个问题提出一些建议,我自己也没有遇到任何问题。这个问题具体是关于是否有办法(a)为特定的类实例动态重新定义@properties,或者(b)在特定情况下覆盖AR​​C的weak / strong行为(从这个问题在MRC中不存在。)

2 个答案:

答案 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)

在下载期间,创建一个可变字典,以临时存储在本书之前到达的作者对象。收到一本书后,查看该数组并查看作者信息是否存在,如果有,请附上。当你完成清理可变数组时。