我刚注意到在NSMutableArray上调用addObject:
不会访问该数组的setter。
,对于NSMutableArray self.myArray
,[self.myArray addObject:object]
不使用[self setMyArray:array]
来添加对象。
以前我一直在使用自定义设置器和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:
以及可能绕过设置者的其他类似功能更改阵列时,如何实现相同的功能?
答案 0 :(得分:3)
一般来说,这类问题是NSMutableArray
通常避免NSArray
优先考虑的原因。
这是一个简单的解决方案,使用NSArray代替NSMutableArray:
self.myArray = [self.myArray arrayByAddingObject:foo];
但是,如果阵列非常大,会导致性能问题。然后你有两个选择:
addObjectToMyArray:
方法,并始终使用NSArrayController
并使用它来访问您的阵列。它将实现关键值观察和绑定以及所有这些。 NSMutableArray
旨在使用尽可能少的CPU指令执行addObject:
,因此无法通过任何方式通知外部代码已添加对象。你必须有一些其他课程。
不要尝试子类NSMutableArray
,因为它是一个“类集群”,使子类极其复杂。
答案 1 :(得分:0)
如果您希望做的是确保数组中的对象属于特定类,则this answer问题“NSMutableArray - 强制数组仅保存特定对象类型”提供了完全相同的代码。 / p>
如果您希望对作业进行其他检查,那么您可以使用该答案中的代码作为起点。