Objective-c返回方法返回NSMutableArray而不是声明的NSArray返回类型

时间:2011-07-06 10:12:21

标签: objective-c cocoa nsmutablearray nsarray return-type

如果我想返回一个像+ (NSArray *)ids这样的不可变数组,但在这个方法中我声明NSMutableArray,因为我想用-sortUsingSelector:对它进行排序。

返回此方法非常有效。

  • 但编写声明返回方法应该是一种类型且实际类型是另一种类型的代码是否“没问题”?

  • 这是否有效,因为NSMutableArrayNSArray的子类?

  • 实际回报值是NSArray还是NSMutableArray

2 个答案:

答案 0 :(得分:6)

  

(...)编写声明返回方法应该是一种类型且实际类型是另一种类型的代码是否“好”?

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

  

这是否有效,因为NSMutableArray是NSArray的子​​类?

完全。由于NSMutableArrayNSArray的子类,因此它继承了所有方法和声明的属性,因此它的公开行为类似于NSArray。这称为Liskov substitution principle

  

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

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

答案 1 :(得分:2)

  • 是否“好”是一个棘手的问题。如果它是一个小项目,只有你使用代码,它可能是好的。但是,如果您依赖于无法更改返回的“NSArray”,那就不行了。 (见最后一点)

  • 是。

  • 这是NSMutableArray。简单的强制转换将允许您更改其中的值。

如果您确实想要返回一个不可变对象,请执行以下操作:

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