【问题标题】:Question about autorelease object in Objective-C关于 Objective-C 中自动释放对象的问题
【发布时间】:2011-09-04 17:31:57
【问题描述】:

我有一个名为users 的实例变量定义为NSMutableArray。

我使用该变量填充UITableView。

在viewDidLoad我初始化它:

users = [[MySingleton sharedClass] getUsers];

这是getUsers 方法:

- (NSMutableArray *)getUsers
{
    ...   
    NSMutableArray *listArray = [[NSMutableArray alloc] init];

    for (NSDictionary *dict in jsonObject) {
        ...
        [listArray addObject:element];
        ...
    }

    return listArray;
}

通过这种方式,一切正常。问题是当我将 listArray 设置为自动释放对象时。

NSMutableArray *listArray = [[[NSMutableArray alloc] init] autorelease];

或

return [listArray autorelease];

有时应用会因EXC_BAD_ACCESS 而崩溃。

为什么会这样?是不是设置正确autoreleaselistArray?

【问题讨论】:

    标签: iphone objective-c memory-management exc-bad-access


    【解决方案1】:

    假设users = [[MySingleton sharedClass] getUsers] 中的users 是一个实例变量,您就会忘记获取数组的所有权。当你想要声明一个对象(比如这个数组)的所有权时,你需要给它发送retain 告诉它你希望它留下来。完成后,您需要发送release 告诉它。 Setter 会为您处理这个问题,因此在 init 和 dealloc 方法之外使用 setter 通常是个好主意。因此,假设您有一个 users 的设置器,您可以执行以下操作之一:

    self.users = [[MySingleton sharedClass] getUsers];
    /* OR */
    users = [[[MySingleton sharedClass] getUsers] retain];
    

    第一种方法通常更好,但您不想在init… 或dealloc 方法中调用setter,因为它们可能会产生不受欢迎的副作用。由于您不在此处使用其中一种方法,因此您可以使用第一种。

    【讨论】:

    • 感谢您的解释。但是self.users = ... 和users = ... 有什么区别呢?另外,我应该在getUsers 方法中将 listArray 设置为 autorelease,对吗?
    • @Fred Collins:是的,该方法应该自动释放数组。而users =和self.users =的区别在于,一个设置实例变量,另一个调用属性设置器。
    【解决方案2】:

    您已经创建并分配了一个自动释放的对象给用户。通过指定 autorelease 你是说系统可以释放它。因此,当它到达自动释放池的末尾时,它会从内存中删除。这就是为什么当您尝试延迟访问它时它会崩溃。因此,如果您需要它是全球性的,那么您需要保留它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多