Objective c NSArray何时不再包含相同的项目?

Objective c NSArray何时不再包含相同的项目?,objective-c,cocoa,nsarray,nsdictionary,Objective C,Cocoa,Nsarray,Nsdictionary,我有一个存储词典的NSArray。每本字典有两个键;名称和包含“items”的子数组 我想检查这些字典中是否有一本在某次操作后仍保留在NSArray中。在操作之前,我存储一个名为“orginalDictionary”的指针,指向我感兴趣的字典。然后,我执行从该字典内的子数组中删除其中一个“项”的操作。在操作之后,我想我可以使用 if ([arrayOfDictionaries containsObject:originalDictionary]) {... 但它并没有像预期的那样起作用。即使数

我有一个存储词典的NSArray。每本字典有两个键;名称和包含“items”的子数组

我想检查这些字典中是否有一本在某次操作后仍保留在NSArray中。在操作之前,我存储一个名为“orginalDictionary”的指针,指向我感兴趣的字典。然后,我执行从该字典内的子数组中删除其中一个“项”的操作。在操作之后,我想我可以使用

if ([arrayOfDictionaries containsObject:originalDictionary]) {...
但它并没有像预期的那样起作用。即使数组仍然包含原始字典(尽管其中包含修改过的子数组),调用仍返回数组不再包含该字典

这是对的吗?如果数组中的项发生更改,containsObject是否不再将其识别为同一对象?还是这里发生了什么事

编辑 我开始认为数组的填充方式是根本原因。字典数组是从一个或多个其他数组创建的,具体取决于某些设置。这些数组本身是使用fetch请求填充的,fetch请求根据所获取的对象创建字典。因此,当某些数据发生更改时,或者即使只是通过请求数组的返回结果来触发fetch,这将重建返回的数组,其中的字典将是新项。这听起来对吗?如果是这样,我想我别无选择,只能存储一个自我管理的唯一键?

containsObject:确定表示相同值的对象是否在数组中,这与isEqual:和IndexOfoObject:使用的测试相同。例如,包含相同键/值对的两个完全不同的字典将进行相等比较,因为它们都表示相同的值-就像两个整数变量在包含相同的整数值时比较相等一样

IndexOfoObjectIdenticalTo方法:查找数组中是否存在该对象

然而,这并不能直接解决你的问题。如果您实际有一个包含NSMutableDictionary的NSMutableArray,并且您保留了对正在检查的NSMutableDictionary的引用,那么值或对象比较应该可以工作


使用调试器跟踪实际引用地址/指针,或使用NSLog和%p格式将它们转储到控制台,例如。NSLog@Trackeddict:%p,originalDictionary.

PS-我想我可以在每个字典中添加第三个值,表示一个唯一的键,以便进行比较?但我想知道这是否必要。听起来你正在做的应该在理论上可行。这些词典是可变词典吗?另外,如何更改字典中未删除的数组?如果它们不是可变字典,那么任何“更改”实际上都会为您提供一个新字典。另外,只需阅读“containsObject”方法上的doco-注意,它使用“isEqual”实现进行检查,即不仅仅是一个直接指针比较-NSDictionary isEqual可能不仅仅是一个直接指针比较这就可以解释了。@gamozzii-是的,它们是易变字典。op级数组本身是从其他一些数组填充的,这些数组反过来使用一个获取请求。当我执行操作时,它将更新一个“项”。这将导致不同的获取对象集,这反过来意味着一个字典的子数组中的不同项,并且字典本身可能在更改后不再存在。这就是我要测试的。@gamozzii-你让我想到了看编辑问题谢谢你的指导。我已经开始记录指针的地址,它从创建到比较之前都没有变化。如果我在记录每个人地址的字典中循环,匹配的字典确实会返回与*originalDictionary不同的地址,-但这是预期的,对吗?指针和字典本身都有一个唯一的地址?或者我应该期望它们是一致的吗?我编辑了这个问题,并提供了关于数组如何填充的更多细节。@BenPackard:指针是地址。假设您将originalDictionary声明为NSMutableDictionary*originalDictionary,它的值是字典的地址。谢谢Peter。似乎每次我请求时都在重新填充数组,这意味着字典是另一个对象。我将此标记为正确答案,因为它是containsObject方法的最完整描述。它帮助我排除了它是我的问题的原因,并继续在我的代码中寻找其他地方。