如果返回类型的方法是NSArray,将返回值类型从NSMutableArray转换为NSArray是一种好习惯吗?

时间:2012-08-27 14:46:33

标签: iphone objective-c

在下面的代码中,如果我返回NSMutableArray而不是NSArray(方法的返回类型),我不会收到任何警告或编译错误。

但是使用-copy方法将返回值转换为NSArray是一种好习惯吗?如下所示? 或者我应该返回NSMutableArray吗?

+(NSArray *)returnImutableArray {
    NSMutableArray *arr = [[NSMutableArray alloc] init];
    [arr addObject:@"a"];
    [arr addObject:@"b"];

    //return arr; // no warning
    return [arr copy];
}

3 个答案:

答案 0 :(得分:6)

我认为这基本上是个人偏好。通过在返回数组之前复制数组,会导致(可能很小的)性能损失。好处是,你将完全防止结果的进一步突变。但是,我通常不会遇到麻烦。因为方法的声明返回类型是 immutable NSArray,所以如果你尝试在其上调用NSMutableArray的一个变异方法,编译器会发出警告,除非你不顾一切地阻止它(通过强制转换)到NSMutableArray)。

因此,简而言之,这是个人偏好,我个人通常不会对不可变副本感到烦恼。

答案 1 :(得分:0)

这完全取决于你想用数组实现的目标。

如果您确实不想或不需要修改返回的数组,请将其作为NSArray返回。 您也可以将其作为数组返回,而无需复制它。

在这两种情况下,都不要忘记内存管理。

你永远不应该保留任何保留计数> 0的东西。

+(NSArray *)returnImutableArray {
    NSMutableArray *arr = [[NSMutableArray alloc] init];
    [arr addObject:@"a"];
    [arr addObject:@"b"];

    NSArray * returnArray = [NSArray arrayWithArray:arr];
    [arr release];
    //return arr; // no warning
    return returnArray;
}

或者你可以这样做:

+(NSArray *)returnImutableArray {
    NSMutableArray *arr = [[NSMutableArray alloc] init];
    [arr addObject:@"a"];
    [arr addObject:@"b"];
    //return arr; // no warning
    return [arr autorelease];
}

没有必要复制NSMutableArray,因为它扩展了NSArray,因此如果你这样做,你的代码永远不会破坏。

答案 2 :(得分:0)

默认情况下,我返回一个不可变的copy内部可变实例。不只是NSArray,还有其他几种类型。

我不希望可变对象漂浮在周围,尽管只要你将它视为具体的,它就不会变异。

我认为这是一个更好的默认值,因为最小化浅层复制(如果共享)。也就是说,如果您获取结果并将其分配给一个或多个copy属性的对象,那么所有这些操作必须生成具体的浅层副本,而它们可以有效地retain。这与您应该copy支持这些类型的属性的原因相同,而不是在声明属性时使用retain

在某些情况下,你只知道它的范围是有限的,并且可变性不会出来 - 在这种情况下,我可能不会打扰制作副本。