Iphone 不需要的变量释放(iOS)
我有Iphone 不需要的变量释放(iOS),iphone,ios,objective-c,asihttprequest,dealloc,Iphone,Ios,Objective C,Asihttprequest,Dealloc,我有UIViewController和strongDataController包含并管理项目列表(itemsList)。在后者的初始化方法中,我从文件中读取项目,通过web服务(和ASIHTTPRequest)获取每个项目的附加信息,并将项目放入一个列表中,然后将该列表分配给itemsList属性 对于同步请求,一切正常,但我需要一个异步实现。我这样做了,现在我的项目被解除分配(数据控制器没有),请求的委托等也消失了。我怎样才能让这些物品保持活力 在我的数据控制器中: -(id)initData
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
中,但我不知道应该把它放在哪里
编辑:
-(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;
}
清单的定义:
@property(非原子,复制)NSMutableArray*itemsList代码>
我想知道的是,即使在我可以将项目放入列表之前,这些项目都是nil
。。。因此,我尝试将属性strong
改为copy
,但没有任何变化
MyItem *item = ...
这个局部变量构成一个强引用。如果initWithParam:
返回一个对象(而不是nil),则在将其添加到列表(这将创建另一个强引用)之前,无法将其释放
请注意,您的财产申报存在缺陷:
@property (nonatomic, copy) NSMutableArray *itemsList;
copy
属性与可变对象类型不匹配:分配属性时,合成setter对其调用copy
,从而创建数组的不可变的副本并分配该副本。这与财产的类型相矛盾
事实上,这是一个很好的机会,可以提供另一个有用的clang编译器警告:当属性的类型符合NSMutableCopying
时,不能声明属性copy
。叮当声,你们听到了吗
这个局部变量构成一个强引用。如果initWithParam:
返回一个对象(而不是nil),则在将其添加到列表(这将创建另一个强引用)之前,无法将其释放
请注意,您的财产申报存在缺陷:
@property (nonatomic, copy) NSMutableArray *itemsList;
copy
属性与可变对象类型不匹配:分配属性时,合成setter对其调用copy
,从而创建数组的不可变的副本并分配该副本。这与财产的类型相矛盾
事实上,这是一个很好的机会,可以提供另一个有用的clang编译器警告:当属性的类型符合NSMutableCopying
时,不能声明属性copy
。clang team,你听到了吗?请将ivar\u itemsList是如何定义的添加到问题中。如果需要响应数据来完成初始化,则无法从'init'方法中进行异步调用……”这里的项已被解除分配?!“不,不能,但可以为零。您在这里记录了项目吗?不清楚for循环与异步调用之间的关系。从您发布的内容来看,在初始化数据控制器时,该循环似乎会立即运行,而不是在异步方法返回结果之后。谢谢大家!@Wain的答案是完美的,我将初始化和对服务器的调用分开,现在它可以工作了。请将ivar\u itemsList是如何定义的添加到问题中,如果需要响应数据来完成初始化,您不能在'init'方法中进行异步调用…“这里的项已经被释放了?!”不,不可能,但可能是零。您在这里记录了项目吗?不清楚for循环与异步调用之间的关系。从您发布的内容来看,在初始化数据控制器时,该循环似乎会立即运行,而不是在异步方法返回结果之后。谢谢大家!@Wain的答案是完美的,我将初始化和对服务器的调用分开,现在它可以工作了。非常感谢。在阅读了您的答案之后,我意识到实际上我在init方法中没有返回任何内容,在我退出该方法之前,该项被释放。所以@Wain在我的问题的评论中给出了完美的答案。但是,您能告诉我数组应该使用哪些属性吗<代码>非原子,强
?还是别的?非常感谢。在阅读了您的答案之后,我意识到实际上我在init方法中没有返回任何内容,在我退出该方法之前,该项被释放。所以@Wain在我的问题的评论中给出了完美的答案。但是,您能告诉我数组应该使用哪些属性吗<代码>非原子,强?还是别的什么?