Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/111.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 不需要的变量释放(iOS)_Iphone_Ios_Objective C_Asihttprequest_Dealloc - Fatal编程技术网

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在我的问题的评论中给出了完美的答案。但是,您能告诉我数组应该使用哪些属性吗<代码>非原子,强?还是别的什么?