将obj作为属性与方法参数(样式首选项)进行访问

时间:2013-08-19 18:49:24

标签: ios objective-c

当谈到从相同类中的不同方法访问对象时,根据我的理解,这是两种方法。鉴于我 DO 想要保存一个指向此对象的属性指针,这是更好的方法吗?我一直在考虑这个问题,并想知道是否存在偏好共识。

#1:

NSArray *array = ... // Get array from somewhere
self.myArray = array;

[self doSomethingToMyArray];

此方法不带参数,并通过self

通过自己的属性访问数组
- (void)doSomethingToMyArray
{
// Do stuff with/to the array via self.myArray
[self.myArray ...];
}

vs #2:

NSArray *array = ... // Get array from somewhere
self.myArray = array;

[self doSomething:array];

此方法接受一个数组并通过自己的方法参数

访问该数组
- (void)doSomething:(NSArray *)array
{
// Do stuff with/to the array via method parameter "array"
[array ...];
}

4 个答案:

答案 0 :(得分:4)

我认为这主要取决于doSomethingToMyArray做什么以及谁叫它。

相当明显的评论:

  • 如果你想对多个数组执行此操作,则需要参数;
  • 如果你所做的事实上在逻辑上更多地与数组有关而不是你的类(例如你已经实现了数组顺序的随机化)那么它会更好地作为{{1}上的类别而不是在那个班级的任何地方;
  • 如果子类有可能想要重新定义获取数组的方式,那么你将需要在某处调用getter;
  • 类似的问题适用于子类或外部参与者应该能够在流程中的任何其他地方进行调解。

除了这些问题之外,还有很多我们只是喜欢这些东西才能发挥作用 - 注意到你正在做 数组,而不是 数组,在这种情况下,如果类别提示有意义,则更倾向于NSArray(或self.myArray = [self processedFormOf:array]

所以,嗯,我认为没有一个明确的答案。

答案 1 :(得分:3)

这取决于你想做什么,只需阅读它:

   doSomething:array

我认为上面的方法采用ANY数组并执行操作,而:

    doSomethingToMyArray

使用此方法,您将描述对实例的数组执行某些操作的意图。在这个方法中(假设您遵循Apple良好的编码实践并将您的属性合成为_myArray),您可以选择:

    [self.myArray message]

或者最好

    [_myArray message]

答案 2 :(得分:1)

你的第二个选择有点傻。如果你在一个实例中存储一个指针,那么你可以在以后(在那个实例中)使用它,而不需要在调用方法时传递它。

这还取决于您是否使用ARC(如果这是一个新项目,请使用ARC)。在非ARC项目中,self.myArray = foo;将执行与myArray = foo;完全不同的事情(self.语法调用属性,在许多情况下,该属性将正确保留您已分配的内容) 。在ARC项目中,它们通常具有相同的行为,并且错误的空间较小。

就我个人而言,在我的ARC项目中,我不使用类中的self.语法,因为它只是为了同样的效果而进行额外输入。这与@property的新用法非常吻合,您不再需要编写@synthesize块,而Objective-C会自动为您生成一个ivar,其名称为您的属性以下划线为前缀,即_myPropertyName。当你从类外部访问代码(穿过封装边界)时,这会使视觉非常清晰,其中事物看起来像foo.bar = baz;而不是类内部,只有_bar = baz;

答案 3 :(得分:0)

恕我直言,显然,函数调用会产生额外的开销。

  • 你必须在堆栈(额外内存)上分配一个对象指针(尽管是最小的)
  • 必须通过(额外处理)

除非您对getter进行了自定义,否则属性实际上是一个小函数调用。我还假设编译器可能为这些访问器设置了自己的优化,以便您可以以最小的开销访问它们,尽管我没有任何来源引用它。