我UIViewController
strong
DataController
包含并管理项目列表(itemsList
)。在后者的初始化方法中,我从文件中读取项目,通过Web服务(和ASIHTTPRequest
)获取每个项目的附加信息,并将项目放入列表中,然后将其分配给{{1}属性。
使用同步请求一切正常但我需要一个异步实现。我做了它,现在我的项目被解除分配(数据控制器没有),跟随请求的代表等也消失了。我怎样才能让这些物品保持活力?
在我的数据控制器中:
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
,但没有任何变化
答案 0 :(得分:1)
MyItem *item = ...
此局部变量形成强大的参考。如果initWithParam:
返回一个对象(不是nil),则在添加到列表(创建另一个强引用)之前,它无法被释放。
请注意您的财产声明存在缺陷:
@property (nonatomic, copy) NSMutableArray *itemsList;
copy
属性与可变对象类型不匹配:分配属性后,合成的setter会在其上调用copy
,从而创建不可变副本的数组并指定它。这与财产的类型相矛盾。
这实际上是另一个有用的clang编译器警告的好机会:当类型符合copy
时,无法声明属性NSMutableCopying
。铿锵队,你听到了吗?。