1

我有UIViewController包含strong DataController和管理项目列表(itemsList)。在后者的初始化方法中,我从文件中读取项目,通过 Web 服务(和)获取每个项目的附加信息,ASIHTTPRequest并将项目放入列表中,然后将其分配给itemsList属性。

使用同步请求一切正常,但我需要一个异步实现。我做到了,现在我的项目被解除分配(数据控制器没有),跟随请求等的代表也消失了。我怎样才能让物品保持活力?

在我的数据控制器中:

-(id)initDataController
{
self = [super init];
if (self)
{
    NSMutableArray *myList = [[NSMutableArray alloc] init];

    // Read items from file ...

    for (NSString *itemName in items) {
        MyItem *item = [[MyItem alloc] initWithParam:itemName];
        // Here the item has already been deallocated?!
        if (item) {
            [myList addObject:item];
        }
    }
    _itemsList = myList;
    return self;
}
return nil;
}

MyItem课堂上,只有对服务器的标准请求和初始化。我认为问题应该在一些缺失strong/retain但我不知道我应该把它放在哪里。

编辑:

列表的定义:

@property (nonatomic, copy) NSMutableArray *itemsList;

我想知道的是,这些项目nil甚至在我可以将它们放入列表之前......所以我尝试制作属性strong而不是copy但没有任何改变。

4

1 回答 1

1
MyItem *item = ...

这个局部变量形成一个强引用。如果initWithParam:返回一个对象(不是 nil),那么在添加到列表之前就无法释放它(这会创建另一个强引用)。

请注意,您的财产申报有缺陷:

@property (nonatomic, copy) NSMutableArray *itemsList;

copy属性不适用于可变对象类型:分配属性时,合成的 setter 会调用copy它,它会创建数组的不可变副本并分配它。这与财产的类型相矛盾。

copy这实际上是另一个有用的 clang 编译器警告的好机会:当它们的类型符合时不能声明属性NSMutableCopying。铿锵队,你听到了吗?

于 2013-05-23T15:20:24.150 回答