我刚刚注意到在 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 - 强制数组仅保存特定对象类型"问题的回答提供了执行此操作的代码。
如果您希望对分配进行其他检查,则可以使用该答案中的代码作为起点。