gpt4 book ai didi

objective-c - 由于 addObject 不访问 setter,如何检查分配?

转载 作者:行者123 更新时间:2023-12-03 16:32:29 25 4
gpt4 key购买 nike

我刚刚注意到在 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 并使用它来访问您的数组。它将实现键值观察和绑定(bind)以及所有这些东西。

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

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

关于objective-c - 由于 addObject 不访问 setter,如何检查分配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13634929/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com