我有一个包含NSMutable对象数组的模型类。控制器类需要访问此数组,但该访问应该是只读的。
应如何实施?模型是否应该将数组公开为(只读)NSMutable数组并使用consts,或将其公开为NSArray?如果后者如何从NSMutableArray有效地创建NSArray,即NSArray应该如何包含对NSMutableArray /其内容的引用而不是具有重复副本? (NSMutableArray保证在控制器访问时保留在内存中。)
答案 0 :(得分:11)
您可以直接退回NSMutableArray
:
- (NSArray *)method
{
return myMutableArray;
}
NSMutableArray
是NSArray
的子类,因此控制器将能够对其执行所有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