2

我刚刚注意到调用addObject:NSMutableArray 不会访问该数组的设置器。

例如,对于 NSMutableArray self.myArray[self.myArray addObject:object][self setMyArray:array]用于添加对象。

以前我一直在使用自定义 setter 和 getter 在分配之前检查分配;例如,如果我想要一个只接受 class 对象的数组MyClass,我会执行以下操作:

- (void)setMyArray:(NSMutableArray *)myArray
{
    for (id object in myArray)
    {
        if (![object isKindOfClass:[MyClass class]]) return;
    }
    _myArray = myArray;
}

- (NSMutableArray *)myArray
{
    if (!_myArray) _myArray = [[NSMutableArray alloc] init];
    _myArray = myArray;
}

addObject:通过,removeObject:和其他可能绕过 setter 的类似功能更改数组时,如何实现相同的功能?

4

2 回答 2

3

通常这种问题是为什么NSMutableArray通常优先避免的原因NSArray

这是简单的解决方案,使用 NSArray 而不是 NSMutableArray:

self.myArray = [self.myArray arrayByAddingObject:foo];

但是,如果数组真的很大,就会导致性能问题。那么你有两个选择:

  • 您可以在课堂上拥有自己的addObjectToMyArray:方法并始终使用它
  • 您可以创建一个NSArrayController并使用它来访问您的阵列。它将实现键值观察和绑定以及所有这些东西。

NSMutableArray被设计为addObject:使用尽可能少的 CPU 指令执行,因此没有证明有任何方法可以通知外部代码添加了对象。你必须有一些其他的类围绕它。

不要尝试子类NSMutableArray化,因为它是一个“类集群”,使得子类变得极其复杂。

于 2012-11-29T21:32:37.597 回答
0

如果您要做的是确保数组中的对象属于特定类,那么这个对“NSMutableArray - 强制数组仅保存特定对象类型”问题的回答提供了执行此操作的代码。

如果您希望对分配进行其他检查,则可以使用该答案中的代码作为起点。

于 2012-11-30T09:57:19.150 回答