0

当涉及到从同一类中的不同方法访问对象时,据我了解,这是两种方法。鉴于我确实持有一个指向该对象的属性指针,这是更好的方法吗?我一直在考虑这个问题,想知道是否存在偏好共识。

#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 ...];
}

#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

4 回答 4

4

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

相当明显的评论:

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

除了这些担忧之外,我们中的许多人只是更喜欢这些东西是功能性的——注意你正在对数组做一些事情而不是对数组一些事情,在这种情况下你会更倾向于self.myArray = [self processedFormOf:array](或者self.myArray = [array arrayByDoingSomething];如果类别提示说得通)。

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

于 2013-08-19T19:17:28.500 回答
3

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

   doSomething:array

我假设上述方法采用 ANY 数组并执行操作,而:

    doSomethingToMyArray

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

    [self.myArray message]

或者最好

    [_myArray message]
于 2013-08-19T19:19:51.030 回答
1

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

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

就个人而言,在我的 ARC 项目中,我不使用self.类中的语法,因为它只是为了达到相同的效果而额外输入。这与 的新用法很好地结合在一起@property,您不再需要编写@synthesize块,Objective-C 将自动为您生成一个 ivar,您的属性名称以下划线为前缀,即_myPropertyName. 当您从类外部(跨越封装边界)访问代码时,这使得在视觉上非常清楚,事情看起来像foo.bar = baz;在类内部,它只是_bar = baz;.

于 2013-08-19T19:17:12.640 回答
0

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

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

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

于 2013-08-19T18:59:23.613 回答