将Obj-C 2.0属性与可变对象(如NSMutableArray)一起使用的最佳方法是什么?

Nic*_*rge 12 iphone macos cocoa properties objective-c

我有一个具有NSMutableArray属性的Obj-C 2.0类.如果我使用下面的代码,那么合成的setter将给我一个不可变的副本,而不是一个可变的副本:

@property (readwrite, copy) NSMutableArray *myArray;
Run Code Online (Sandbox Code Playgroud)

有没有理由说Apple没有实现以下语法?

@property (readwrite, mutablecopy) NSMutableArray *myArray;
Run Code Online (Sandbox Code Playgroud)

既然我们没有mutablecopy,那么处理这种(看似常见的)情况的最佳方法是什么?我应该编写自己的setter来执行-mutableCopy吗?

Mar*_*fer 14

我前段时间遇到了同样的问题,并在Apple Developer Connection上发现了一个文档,建议您提供自己的setter实现.代码示例形成链接文档:

@interface MyClass : NSObject {
    NSMutableArray *myArray;
}
@property (nonatomic, copy) NSMutableArray *myArray;
@end

@implementation MyClass

@synthesize myArray;

- (void)setMyArray:(NSMutableArray *)newArray {
    if (myArray != newArray) {
        [myArray release];
        myArray = [newArray mutableCopy];
    }
}
Run Code Online (Sandbox Code Playgroud)


Bar*_*ark 5

NSMutableArray在Cocoa 传递s 并不常见.标准Cocoa实践是为索引到多个属性实现符合键值编码的方法.这有两个好处:

  1. 键值观察按预期工作(有几种情况下,观察NSMutableArray导致不是你想要的行为)
  2. 隐藏数据结构的实现是因为您公开了变异方法(例如-[MyObject insertObjectInMyProperty:(id)newObject atIndex:(NSUInteger)i],不是数据结构本身).


wby*_*ung 4

如前所述,正确的方法不是将可变数组设为属性。这里有关于应该实现什么来兼容 KVC 的详细解释。