返回mutable与返回的不可变(非成员)对象

mtr*_*ree 8 cocoa objective-c nsmutablearray

我几乎没有看到第二个用过,我想知道为什么?

  • 它也不会破坏NSArray预期的情况的支持(因为它是一个子类).
  • 它也不会通过揭示可变的内部结构来破坏封装.

在前提条件下,它永远不会是一个可变的ivar返回,(无论如何应该是常识)
我现在只能想到使用第二个的优点.

  • 它实际上可变的.静音在这里是安全的,为什么要防止呢
  • 无需调用[[[foo fooBar] mutableCopy] autorelease],不必要地分配额外的内存,不必要地浪费时间.

以下是方法变体:

- (NSArray *)fooBar {
    NSMutableArray *fooArray = [NSMutableArray array];
    //populate fooArray
    return fooArray;
}

- (NSMutableArray *)fooBar {
    NSMutableArray *fooArray = [NSMutableArray array];
    //populate fooArray
    return fooArray;
}
Run Code Online (Sandbox Code Playgroud)

我问,因为我的项目有一堆具有相同模式的方法.
并且在大多数情况下,返回的数组将在之后被修改(合并,编辑等).
所以我认为返回应该是完全没问题NSMutableArrays,但似乎没有人这样做.

NSMutableArray,NSMutableSet,NSMutableDictionary...它基本上是相同的交易.

oct*_*cty 2

我认为第一个变体是首选,因为多态性是首选。

无论哪种情况,两种方法都会返回 的实例NSMutableArray,唯一的区别是第一个方法向调用者隐藏了该事实。换句话说,第一种变体并不第二种更安全。NSArray它本质上是使用多态性来告诉调用者可以返回任何类型。如果您的代码需要这种灵活性,那么它肯定有它的优势。(例如,如果有一天,无论出于何种原因,您需要返回一个自定义NSArray子类,您的代码不会在该级别中断)。

但是,您似乎更喜欢向调用者传达意图 - 即您实际上返回可变数组 - 这也可以。为了让每个人都高兴(如果有这样的事情无论如何......),我建议将第二种方法重命名为:

- (NSMutableArray *)mutableFooBar {
    NSMutableArray *fooArray = [NSMutableArray array];
    //populate fooArray
    return fooArray;
}
Run Code Online (Sandbox Code Playgroud)

作为旁注,我认为以下是将现有不可变数组转换为可变数组的稍微更有效的方法:

NSMutableArray *mutableArray = [NSMutableArray arrayWithArray:fooArray];
Run Code Online (Sandbox Code Playgroud)

(如果我的假设是错误的,请纠正我)。

我希望这回答了你的问题...