【发布时间】:2016-03-30 07:46:39
【问题描述】:
我学到了当你循环遍历其中的对象时无法从 NSMutableArray 中删除对象的艰难方法。
循环通过[< array_object > copy] 而不是< array_object > 修复它。
但是,我有一些未解决的问题希望 Objective-C 专家提供意见。
-
在第一个 for 循环中,我希望每个
nextObjects 指向不同的内存(即我认为msgDetail数组将有一个指针列表,每个指针指向NSDictionary的地址一个特定的数组索引包含)。但是所有的%p nextObject打印都给出了相同的值。这是为什么呢?for(NSDictionary *nextObject in msgDetailArray) { NSLog(@"Address = %p, value = %@",&nextObject,nextObject) ; //Doing [msgDetailArray removeObject:nextObject] here based on some condition fails } -
在第二个 for 循环中,
nextObjectNSDictionarys 的地址与第一个 for 循环中打印的地址不同。for(id nextObject in [msgDetailArray copy]) { NSLog(@"In copy Address = %p, value = %@",&nextObject,nextObject) ; //Doing [msgDetailArray removeObject:nextObject] here based on some condition succeeds and it also removes it from the original array even though I am looping through a copy } -
但是,当我遍历
[msgDetailArray copy],然后执行removeObject:时,它会将其从原始msgDetailArray中删除。removeObject:是如何做到这一点的?它实际上是否使用字典的内容并删除与内容匹配的对象?我认为它所做的只是检查是否有一个对象位于同一内存位置并将其删除(基于2,我假设包含[msgDetailArray copy]中的字典的内存地址与原始地址不同msgDetailArray)。如果是实际使用的内容,我将不得不非常小心,以防有重复条目。for(id nextObject in msgDetailArray) { NSLog(@"Address = %p, value = %@",&nextObject,nextObject) ; //test what is left in msgDetailArray. I see that doing removeObject on [msgDetailArray copy] does remove it from the original too. How is removeObject working (is it actually contents of dictionary) }
【问题讨论】:
标签: ios objective-c cocoa-touch nsmutablearray fast-enumeration