如何检查赋值,因为addObject不访问setter?

时间:2012-11-29 21:19:51

标签: objective-c cocoa-touch cocoa setter getter-setter

我刚注意到在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:以及可能绕过设置者的其他类似功能更改阵列时,如何实现相同的功能?

2 个答案:

答案 0 :(得分:3)

一般来说,这类问题是NSMutableArray通常避免NSArray优先考虑的原因。

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

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

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

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

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

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

答案 1 :(得分:0)

如果您希望做的是确保数组中的对象属于特定类,则this answer问题“NSMutableArray - 强制数组仅保存特定对象类型”提供了完全相同的代码。 / p>

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