6

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

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

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

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*。我然后取消引用从 removeNonNumber 返回的指针并将值分配给电话。

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

4

5 回答 5

13

是的,那是行不通的。你需要一个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];
于 2009-11-23T19:06:16.317 回答
4

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

于 2009-11-23T19:09:01.677 回答
2

NSArray不是 C/C++ 样式的数组。它是一个 Objective-C 对象。您需要使用该类的实例方法对其NSArray执行操作。

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

此外,您正在使用所谓的Fast Enumeration,它不允许突变。

于 2009-11-23T19:04:11.077 回答
2

您还可以使用enumerateObjectsUsingBlock:

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

结帐我如何迭代一个 NSArray?

于 2012-05-14T19:24:53.127 回答
0

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

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

旨在让您弄乱内部结构的对象通过诸如NSMutableData's 之类的 api 方法公开这些对象mutableBytes

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

于 2009-11-23T19:06:37.143 回答