如何将NSMutableArray作为NSArray公开为方法的返回类型

时间:2011-12-30 18:13:32

标签: ios

我有一个包含NSMutable对象数组的模型类。控制器类需要访问此数组,但该访问应该是只读的。

应如何实施?模型是否应该将数组公开为(只读)NSMutable数组并使用consts,或将其公开为NSArray?如果后者如何从NSMutableArray有效地创建NSArray,即NSArray应该如何包含对NSMutableArray /其内容的引用而不是具有重复副本? (NSMutableArray保证在控制器访问时保留在内存中。)

5 个答案:

答案 0 :(得分:11)

您可以直接退回NSMutableArray

- (NSArray *)method
{
    return myMutableArray;
}

NSMutableArrayNSArray的子类,因此控制器将能够对其执行所有NSArray操作。如果你真的担心有人可能试图欺骗你,你可以使用:

return [NSArray arrayWithArray:myMutableArray];

返回不可变副本。

答案 1 :(得分:2)

没有只读NSMutableArray。如果您认为将属性定义为只读使得返回的对象不可变,则情况并非如此。

公开NSArray类型的只读属性,并在访问器中返回一个新数组,如下所示:

return [NSArray arrayWithArray:mutableArray];

请注意,数组中的对象(如果可变)仍可更改。

答案 2 :(得分:2)

如果您想继续传递可变数组,但想确保其他方法不会覆盖现有数组,则可以始终传递副本

return [myMutableArray copy];

这样,你返回一个NSArray类型(因为NSMutableArray是一个子类)并确保myMutableArray本身没有被篡改。

答案 3 :(得分:1)

NSMutableArray继承自NSArray,因此除了(可能隐含地)强制转换NSMutableArray以外,没有什么可以将NSMutableArray公开为NSArray。请注意,它仍然是同一个对象,因此如果有人想要聪明,他们可以向下转换它,甚至只是尝试在其上调用NSMutableArray方法。

答案 4 :(得分:0)

虽然这可能有点过分,但您可以创建自己的自定义类,其中包含数组的@private ivar,然后您可以创建只读属性/方法来访问数据。

即(实施代码段):

@interface CustomArray : NSObject
{
    @private
    NSArray *array;
}

@end

- (id)initWithNSArray:(NSMutableArray *)array;

- (id)getObjectAtIndex:(int)index;

@implementation

// implement methods here

@end