本地或实例变量

时间:2012-10-11 15:39:10

标签: objective-c ios uitableview encapsulation

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

1)在.h中定义一个属性,并将该属性设置为@"dataSource

中字典的viewDidLoad

@property (strong, nonatomic) NSMutableArray *dataSource;

2)在.m界面中定义变量

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

3)在我需要的每个方法中创建一个数组实例

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

我倾向于选项2,因为我的应用程序中没有类需要访问数组。但是,选项3使其进一步封装。我想知道这种简单情况的正确方法。

3 个答案:

答案 0 :(得分:1)

选项1和2之间的决定很容易解决:这完全取决于您的datasource是公开的还是私人的;如果它是私人的,那么请选择选项2.

另一方面,选项3似乎不是一个好的选择(如果是1或2)。

如果你的datasource是一个局部变量(即一个变量的整个生命周期受到包含方法运行时的约束),那就没问题了;但在这种情况下,你甚至不会想到将该变量声明为实例变量。

当需要在对声明类的某些方法(甚至在不同时间调用的相同方法)的多个调用之间共享其值时,将变量声明为实例变量。这将决定变量是本地变量还是实例变量。

如果您的意思是使用范围仅限于声明方法的static全局变量,那么这只是表面上的吸引力。实际上,它的问题在于你无法准确预见将来datasource所需的用途:你可能需要访问它 - 无论出于何种原因 - 从另一种方法,然后那种设计不会适应自己。

更一般地说,就封装而言,我认为在OOP中,正确的封装级别是类级别,IMO。这也将排除选项3。

答案 1 :(得分:1)

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

有关详细信息,请参阅此处: http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/objectivec/Chapters/ocCategories.html#//apple_ref/doc/uid/TP30001163-CH20-SW2

作为旁注,私有类扩展还提供了一种创建私有方法的方法。

答案 2 :(得分:0)

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