2012-10-11 70 views
0

我有一个非常简单的TableViewController。我只实现数据源方法和其他两种方法来修改数据源。该表的dataSource数组是从TableViewController的NSDictionary属性classData中的@"dataSource键中检索的数组。我可能在想这,这是使用dataSource阵列我TableViewController的最佳方式:本地或实例变量

1)定义在.H属性和属性设置为字典的@"dataSourceviewDidLoad

@property (strong, nonatomic) NSMutableArray *dataSource;

2)定义在.M接口

@interface TableViewController() { 
    NSMutableArray *dataSource; 
} 
@end 

3)可变的每方法创建阵列的一个实例,我需要它

NSMutableArray *dataSource = [self.classData objectForKey: @"dataSource"];

我倾向于选项2,因为没有在我的应用程序的类需要访问阵列。然而,选项3保持封装更进一步。我想知道这种简单情况的正确方法。

回答

1

选项1和2之间的决定是很容易解决:这一切都取决于你是否datasource应该是公共或私有的;如果是私人的,然后选择2

在另一方面去,选项3也似乎并不真的是一个好选项(如果是1或2)。

如果你的datasource是一个本地变量(即,一个变量的整个生命周期被包含方法运行时所约束),那么它很好;但在这种情况下,您甚至不会想到将该变量声明为实例变量。

你一个变量声明为实例变量,当你需要它多次调用价值份额的声明类(甚至呼吁在不同的时间同样的方法)的一些方法。这将决定变量是本地还是实例。

如果你的意思是使用static全局变量,其范围仅限于申报方式,那么这只是表面上的吸引力。事实上,与此相关的问题是,您无法准确预见将来需要使用datasource的情况:可能出现这种情况,您需要从另一种方法访问它 - 出于任何原因 - 则该设计不会适应自己。

更一般地说,在封装方面,我认为,在面向对象,封装的正确的水平是一流水平,IMO。这也将再次排除选项3.

0

我不明白您的选项#3语句。如何编写效率较低的代码使其更加封装?就个人而言,选项#2是正确的选择。

1

您也可以在私有类扩展中声明属性,而不是公共接口。这可以让你保持它作为一个真正的属性(获得setter/getter methots的好处,如果它变得有用,你可以在以后重载)并且保持该类对于类是私有的。

这里看到更多的信息: http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/objectivec/Chapters/ocCategories.html#//apple_ref/doc/uid/TP30001163-CH20-SW2

作为一个侧面说明,私有类扩展还提供了一种方法来创建私有方法。