我有一个名为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?
答案 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,你说系统可以释放它。所以当它到达自动释放池的末尾时,它会从内存中删除。这就是为什么当你试图访问它时它会崩溃。因此,如果您需要它是全球性的,那么您需要保留它。