如何检查分配,因为 addObject 不访问 setter?



我刚刚注意到在 NSMutableArray 上调用 addObject: 不会访问该数组的 setter。

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

以前我一直在使用自定义 setter 和 getter 在分配之前检查赋值;例如,如果我想要一个只接受类 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 的类似函数更改数组时,我该如何实现相同的功能?

通常,这种问题是通常避免NSMutableArray的原因,而不是NSArray

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

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

但是,如果阵列非常大,则会导致性能问题。那么你有两个选择:

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

NSMutableArray 旨在使用尽可能少的 CPU 指令执行addObject:,因此无法证明任何方式通知外部代码已添加对象。你必须有一些其他的类围绕着它。

不要试图NSMutableArray子类,因为它是一个"类集群",使子类变得非常复杂。

如果您希望

确保数组中的对象属于特定类,那么对"NSMutableArray - 强制数组仅保存特定对象类型"问题的回答提供了执行此操作的代码。

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

最新更新