防止在公共接口中将对象添加到NSMutableArray

Vla*_*mir 9 cocoa encapsulation objective-c declared-property

我想保护对公共接口中NSMutableArray的访问

我试图通过在公共接口中将属性定义为NSArray并在私有接口中将NSMutableArray定义为:

@interface Order : NSObject
@property (readonly, strong, nonatomic) NSArray* comments;
@end

@interface Order()
@property (readwrite, strong, nonatomic) NSMutableArray* comments;
@end
Run Code Online (Sandbox Code Playgroud)

但这不起作用 - 所以我必须在公共接口NSMutableArray中定义属性:

@interface Order
@property (strong, nonatomic) NSMutableArray* comments;
@end
Run Code Online (Sandbox Code Playgroud)

目标是为API客户端提供对注释的只读访问权限,以及addObject:对实现中的方法的完全访问权限.

所以定义目标更清晰:

  1. 客户端应该可以作为NSArray访问属性,而无法访问变异方法.
  2. 客户端无法更新注释以指向新值.
  3. 必须在不创建额外结构和阵列复制的情况下完成解决方案.

所以简单的问题是,是否可以使属性的公共定义更通用(NSArray而不是NSMutableArray).

有没有其他干净的方法来达到目标​​或我必须在任何地方使用NSMutableArray?

解析度

在回顾了我原来的问题和答案之后,我意识到我想在公共接口中使用更多泛型类NSArray,在实现中使用NSMutableArray - 但这对于一个属性来说是不可能的.所以答案是不可能的.

因此,我将使用NSMutableArray的单一属性,而不需要任何额外的保护.

但是如果你真的更喜欢保护而不是简单和高效,我也会选择最合适的答案.

Jos*_*ell 13

如果您只想让客户端读取数组,则不需要公共属性.

只需创建一个访问器方法,该方法返回私有可变数组的副本:

@interface Order : NSObject
- (NSArray *)allComments;
@end

@implementation Order ()
@property (nonatomic, strong) NSMutableArray * comments;
@end

@implementation Order

@synthesize comments;

- (NSArray *)allComments
{
    return [[self comments] copy];
}

@end
Run Code Online (Sandbox Code Playgroud)

这种模式可以在例如NSView:中看到,constraints并且subviews在内部是可变的,但只能通过返回不可变数组的单个方法进行读取.