0

我的项目启用了 ARC,我有两个模型,例如:

Category

@interface Parent : NSObject
@property (assign, nonatomic) Category *parent;
@property (strong, nonatomic) NSArray *children;
@property (strong, nonatomic) NSArray *subCategories;
@end

Product

@interface Child : NSObject
@property (strong, nonatomic) NSString *name;
@property (assign, nonatomic) Category *category;
@end

为了避免引用循环,并在 iOS 4.x 上部署,我将 Child 的 parent 属性设置为assignbut not weak

从 JSON 数据中,我可以获得包含我的类别和产品的树。当我使用树进行枚举时,一切都很完美。而且我有一种递归方法来搜索名称与关键字匹配的产品。方法如下:

- (NSArray *)productsWithKeyword:(NSString *)keyword
{
    NSMutableArray *filteredProducts = [NSMutableArray array];
    for (Category *cat in self.children) {
        NSArray *subResult = [cat productsWithKeyword:keyword];
        [filteredProducts addObjectsFromArray:subResult];
    }

    return [filteredProducts copy];
}

问题是当我使用返回的数组时,我可以获得正确的category属性。但是从第二次开始,该category属性变为 0(从调试器中捕获)。

所以有什么问题?解决这个问题的方法是什么?

4

1 回答 1

0

为了避免引用循环,您希望一个对象对另一个对象具有弱引用,而不是使两者都具有对彼此的弱引用。我认为在这种情况下发生的事情是产品不拥有该类别并且该类别不拥有该产品,因此 ARC 假设没有人声称它们会释放这两个对象。

修复:使这些对象之一成为另一个对象的“父级”。

于 2012-07-05T04:12:08.207 回答