我应该如何初始化一个UITableViewController成员的数组?

时间:2010-07-28 18:06:39

标签: iphone objective-c uitableview ipad

我的表视图的数据源是一个普通的NSMutableArray,它将在应用程序运行时填充,但在表视图首次加载时将为空。类接口看起来像这样......

@interface ViewController_iPhone : UITableViewController  {

    NSMutableArray *serverList; 
}

@property (retain, readonly) NSMutableArray *serverList;

@end

我的问题是......

  1. 目前,我在viewDidLoad方法中初始化它,就像这样......

    serverList = [[NSMutableArray alloc] initWithCapacity:1];

    我是这样做的,因为数组需要有效才能使我的numberOfRowsInSection方法在视图首次加载时读取数组的count(将为零)时避免崩溃。我目前使用initWithCapacity的方法只是感觉有点笨重,因为我只需要一个空的但有效的数组对象,它会在视图加载时返回计数值为零。我应该如何初始化我的serverList数组?

  2. 在玩游戏时,我注意到当我尝试以这种方式初始化serverList数组时......

    serverList = [NSMutableArray arrayWithCapacity:1];

    它崩溃了。为什么呢?

  3. 提前感谢您的帮助!

3 个答案:

答案 0 :(得分:1)

以下是了解成员变量和属性的关键概念:成员变量属性不同。

也就是说,在访问班级中的成员变量时:
serverList = [NSArray array];self.serverList = [NSArray array];

不同

serverList本身就意味着您正在直接访问它 self.serverList表示您正在使用getter / setter方法来访问它。

通常,在处理基本变量类型时,这不是什么大不了的事。但是,当您的媒体资源使用retaincopy时,这意味着您的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为零。