通过取消引用更改 NSArray 中的值?

Posted

技术标签:

【中文标题】通过取消引用更改 NSArray 中的值?【英文标题】:Change the values within NSArray by dereferencing? 【发布时间】:2010-12-19 14:33:18 【问题描述】:

我遇到了一个与objective-c 中的数组中的指针有关的问题。

我要做的是获取 NSArray 中的指针,将它们传递给方法,然后将返回的值分配回原始指针(属于数组的指针)。

根据我对 C 和 C++ 的了解,通过取消引用数组中的指针,我应该能够更改它们指向的值...这是我正在使用的代码,但它不起作用(根据 NSLog 输出,phone 指向的值永远不会改变)。

NSArray *phoneNumbers = [phoneEmailDict objectForKey:@"phone"];
    for (NSString* phone in phoneNumbers) 
        (*phone) = (*[self removeNonNumbers:phone]);
        NSLog(@"phone:%@", phone);
    

这是我将 NSString* 传递给的方法签名:

- (NSString*) removeNonNumbers: (NSString*) string;

如您所见,我正在使用变量 phone 遍历 phoneNumbers 中的每个 NSString*。我将电话传递给 removeNonNumbers:,它返回修改后的 NSString*。 I 然后取消引用从 removeNonNumber 返回的指针并将值分配给电话。

如您所知,我可能不太了解 Objective-C 对象。我很确定这可以在 C++ 或 C 中使用,但我不明白为什么它在这里不起作用!提前感谢您的帮助!

【问题讨论】:

【参考方案1】:

是的,那是行不通的。你需要一个NSMutableArray:

NSMutableArray * phoneNumbers = [[phoneEmailDict objectForKey:@"phone"] mutableCopy];
for (NSUInteger i = 0; i < [phoneNumber count]; ++i) 
  NSString * phone = [phoneNumbers objectAtIndex:i];
  phone = [self removeNonNumbers:phone];
  [phoneNumbers replaceObjectAtIndex:i withObject:phone];

[phoneEmailDict setObject:phoneNumbers forKey:@"phone"];
[phoneNumbers release];

【讨论】:

【参考方案2】:

您不能取消引用 Objective-C 对象变量。它们始终是指针,但您应该将它们视为原子值。您需要改变数组本身以包含您正在生成的新对象。

【讨论】:

【参考方案3】:

NSArray 不是 C/C++ 样式的数组。它是一个 Objective-C 对象。需要使用NSArray类的instance methods对其进行操作。

在 Objective-C 中,您永远不会“取消引用”对象指针来设置其值。

另外,您使用的是所谓的Fast Enumeration,它不允许突变。

【讨论】:

【参考方案4】:

您也可以使用enumerateObjectsUsingBlock:。

NSArray *array = [NSArray array];
__block NSMutableArray *mutableCopyArray = [array mutableCopy];
[mutableCopyArray enumerateObjectsUsingBlock:^(id object, NSUInteger idx, BOOL *stop) 
    [mutableCopyArray replaceObjectAtIndex:idx withObject:[object modifiedObject]];
];

结帐How do I iterate over an NSArray?

【讨论】:

【参考方案5】:

虽然这在某种程度上可能有效,但我没有对其进行测试,我会将其归档在“坏主意”下并且不触碰。 NSArray 和许多其他可可对象,作为类集群设计模式的一部分,相当复杂,并且可以在内部拥有多种实现。

所以当涉及到它时,你真的不知道你在内部处理的是什么。 NSArray 实际上被设计为不可变的,因此就地编辑甚至是一个坏主意。

旨在让您弄乱内部结构的对象通过NSMutableDatamutableBytes 等API 方法公开这些对象。

你最好用处理后的值构造一个新的 NS(Mutable)Array。

【讨论】:

以上是关于通过取消引用更改 NSArray 中的值?的主要内容,如果未能解决你的问题,请参考以下文章

从 UIViewController 传递 NSArray

从 GDB 中的列表中打印取消引用的值

更改 NSMutableDictionary 的值时崩溃

为啥临时变量需要更改数组元素以及为啥需要在最后取消设置?

使用 NSPredicate 根据 NSDictionary 键过滤 NSArray

有没有办法访问/取消引用并查找存储在双指针向量中的元素的值? [关闭]