2011-07-06 95 views
8

如果我想返回一个不可变数组,如+ (NSArray *)ids,但在此方法内部,我声明NSMutableArray,因为我想使用-sortUsingSelector:对它进行排序。返回NSMutableArray而不是声明NSArray的Objective-c返回方法返回类型

返回此方法的工作完美。

  • 但它是“好”编写的代码,声明回报方法应该是同一类型和实际类型是另一个?

  • 请问这是否是因为NSMutableArrayNSArray的子类?

  • 实际回报值是NSArray还是NSMutableArray

+3

在任何语言中,函数的实际返回类型可以是声明的返回类型的子类型作为结果[Liskov替代原则](http://en.wikipedia.org/wiki/Liskov_substitution_principle)。 – outis

回答

6

(...)是“好”编写的代码,声明回报方法应该是一个类型和actualy类型是另一个?

是的,它提供的类型是兼容的;见下一段。事实上,Cocoa中也有一些情况(特别是类集群)也可以这样做。

这是因为NSMutableArray是NSArray的子​​类吗?

没错。由于NSMutableArrayNSArray的子类,因此它继承了它的所有方法和声明的属性,因此它的行为与NSArray的行为相同。这被称为Liskov substitution principle

实际的返回值是NSArray还是NSM​​utableArray?

返回值是您返回的任何值。由于您要退回NSMutableArray,因此这是NSMutableArray。从调用者的角度来看,它是一个可以像NSArray一样使用的对象。

+5

从类型为返回一个'NSArray *'的方法中返回一个可变数组是可以的,但是对于从返回一个'NSArray *'类型的方法中获取的数组,您可能会发生变化。如果方法的声明没有明确说它返回一个可变数组,那么调用者不应该假定它返回一个可变数组。即使在你自己的应用程序中这样做意味着你正在使自己的代码变得更加脆弱。如果该类正在告诉自己的数组进行自我排序,则该方法应该是显式返回可变的访问器。任何其他类应该制作自己的可变副本。 –

+0

@Peter Hosey:+1。 Apple文档明确禁止将对象视为可变的,如果API将其作为不可变的*发布,即使您先测试并发现它是可变的*。 – JeremyP

+1

@Jer [测试可变性并不像最初看起来那么简单](http://stackoverflow.com/q/1788690/557219)。 – 2011-07-06 10:45:05

2
  • 无论是“好”还是不好是一个难题。如果它是一个小项目,只有你使用代码,它可能是好的。但是,如果您依赖于无法更改返回的“NSArray”,则不正常。 (见最后一点)

  • 是的。

  • 这是一个NSMutableArray。一个简单的演员将让你改变它的值。

如果你真的想一回不可变对象,请执行下列操作:

NSArray* immutableArray = [[mutableArray copy] autorelease]; 
    return immutableArray; 
+0

当不在GC或ARC下运行时,不要忘记自动释放它。 –

+0

正确,编辑以反映这一点。 – uvesten