0

我有一个非常简单的 TableViewController。我只实现了数据源方法和其他两种方法来修改数据源。表的dataSource数组是从@"dataSourceTableViewController 的 NSDictionary 属性中的键检索到的数组classData。我可能想多了,这是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 将其进一步封装。我想知道这种简单情况的正确方法。

4

3 回答 3

1

选项 1 和 2 之间的决定很容易解决:这完全取决于您datasource应该是公开的还是私有的;如果它是私有的,则使用选项 2。

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

如果你datasource打算成为一个局部变量(即,一个变量的整个生命周期都由包含方法运行时绑定),那么它很好;但在这种情况下,您甚至不会考虑将该变量声明为实例变量。

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

如果您的意思是使用static范围仅限于声明方法的全局变量,那么这只是表面上的吸引力。事实上,它的问题是您无法准确预见datasource未来需要使用的用途:您可能需要从另一种方法访问它——无论出于何种原因——那么该设计将无法适应本身。

更笼统地说,在封装方面,我认为在OOP中,正确的封装级别是类级别,IMO。这也将再次排除选项 3。

于 2012-10-11T15:43:22.327 回答
1

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

请参阅此处了解更多信息:http: //developer.apple.com/library/ios/#documentation/cocoa/conceptual/objectivec/Chapters/ocCategories.html#//apple_ref/doc/uid/TP30001163-CH20-SW2

附带说明一下,私有类扩展还提供了一种创建私有方法的方法。

于 2012-10-11T17:42:33.110 回答
0

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

于 2012-10-11T15:43:42.920 回答