关于Objective-C中自动释放对象的问题

时间:2011-09-04 17:31:58

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

我有一个名为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而崩溃。

为什么这样?设置不正确autorelease listArray?

2 个答案:

答案 0 :(得分:3)

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

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

第一种方法通常更好,但您不希望在init…dealloc方法中调用setter,因为它们可能会产生不良副作用。由于您不在这里使用其中一种方法,因此您可以使用第一种方法。

答案 1 :(得分:0)

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