我的表视图的数据源是一个普通的NSMutableArray,它将在应用程序运行时填充,但在表视图首次加载时将为空。类接口看起来像这样......
@interface ViewController_iPhone : UITableViewController {
NSMutableArray *serverList;
}
@property (retain, readonly) NSMutableArray *serverList;
@end
我的问题是......
目前,我在viewDidLoad方法中初始化它,就像这样......
serverList = [[NSMutableArray alloc] initWithCapacity:1];
我是这样做的,因为数组需要有效才能使我的numberOfRowsInSection
方法在视图首次加载时读取数组的count
(将为零)时避免崩溃。我目前使用initWithCapacity
的方法只是感觉有点笨重,因为我只需要一个空的但有效的数组对象,它会在视图加载时返回计数值为零。我应该如何初始化我的serverList
数组?
在玩游戏时,我注意到当我尝试以这种方式初始化serverList
数组时......
serverList = [NSMutableArray arrayWithCapacity:1];
它崩溃了。为什么呢?
提前感谢您的帮助!
答案 0 :(得分:1)
以下是了解成员变量和属性的关键概念:成员变量与属性不同。
也就是说,在访问班级中的成员变量时:
serverList = [NSArray array];
与self.serverList = [NSArray array];
serverList
本身就意味着您正在直接访问它
self.serverList
表示您正在使用getter / setter方法来访问它。
通常,在处理基本变量类型时,这不是什么大不了的事。但是,当您的媒体资源使用retain
或copy
时,这意味着您的setter方法会在您使用它时自动保留它,但在您直接访问它时不会这样做。
这意味着:
serverList = [NSArray array];
不会保留数组。
self.serverList = [NSArray array];
将保留数组。
应该注意的是[NSMutableArray arrayWithCapacity:1];
(以及99%的其他非alloc方法)将返回一个自动释放的对象。如果你想保留它供以后使用,在这种情况下需要,那么你必须以某种形式或方式保留它。
答案 1 :(得分:1)
我以某种方式错过了最简单的方法,并发现当我简单地创建数组时......
serverList = [[NSMutableArray alloc] init];
并在dealloc方法中释放它,一切都很棒!
答案 2 :(得分:0)
请注意,容量并不意味着数组中包含任何对象。使用-initWithCapacity:
只需为数组留出一块空间。即使具有非零容量,阵列中也没有任何东西。
以下初始化程序:
self.serverList = [[[NSMutableArray alloc] init] autorelease];
self.serverList = [[[NSMutableArray alloc] initWithCapacity:capacity] autorelease];
self.serverList = [NSMutableArray array];
self.serverList = [NSMutableArray arrayWithCapacity:capacity];
然而,一切都会奏效。
确保指定self
以便访问该属性。单独使用serverList
将无效。
请确保autorelease
您要保留的任何alloc-init
属性,否则您将有内存泄漏。
您不需要具有指定容量的阵列。这只是为了保留连续内存的性能,如果您大致了解阵列需要预先安排多少空间,这将非常有用。通过alloc-init
创建的数组也将为空,count
为零。