不需要的变量发布(iOS)

时间:2013-05-23 15:11:55

标签: iphone ios objective-c asihttprequest dealloc

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,但没有任何变化

1 个答案:

答案 0 :(得分:1)

MyItem *item = ...

此局部变量形成强大的参考。如果initWithParam:返回一个对象(不是nil),则在添加到列表(创建另一个强引用)之前,它无法被释放。

请注意您的财产声明存在缺陷:

@property (nonatomic, copy) NSMutableArray *itemsList;

copy属性与可变对象类型不匹配:分配属性后,合成的setter会在其上调用copy,从而创建不可变副本的数组并指定它。这与财产的类型相矛盾。

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