iphone - 不需要的变量释放(iOS)

标签 iphone ios objective-c asihttprequest dealloc

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

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

在我的数据 Controller 中:

-(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 而不是 复制但没有任何改变。

最佳答案

MyItem *item = ...

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

请注意您的属性(property)申报存在缺陷:

@property (nonatomic, copy) NSMutableArray *itemsList;

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

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

关于iphone - 不需要的变量释放(iOS),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16717627/

相关文章:

iphone - 从 iPhone 使用 POST 到 REST 服务的问题

iphone - 类别头文件没有加密成二进制

iphone - iOS 配置文件过期

ios - 在编辑模式下更改 UITableView 中减号的位置

ios - 下拉刷新时 UITableview 出错,所有数据重复出现。任何人都可以帮助使用 Swift3 , Xcode8

ios - watch 动画

iphone - R可以打包在iOS应用中吗?

iOS 7 应用程序不会填满 Xcode 6 模拟器中的整个屏幕

ios - 缩小和变换 UIButton

objective-c - 带有通用参数的Objective-C类方法无法在Swift中调用