通过解除引用更改NSArray中的值?

时间:2009-11-23 19:00:47

标签: objective-c pointers nsarray dereference

我遇到了与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;

正如您所看到的,我正在使用可变电话迭代phoneNumbers中的每个NSString *。我通过手机删除NonNumbers :,它返回修改后的NSString *。然后取消引用从removeNonNumber返回的指针并将值赋给phone。

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

5 个答案:

答案 0 :(得分: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];

答案 1 :(得分:4)

您无法取消引用Objective-C对象变量。它们总是指针,但你应该把它们视为原子价值。您需要改变数组本身以包含您正在生成的新对象。

答案 2 :(得分:2)

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

在Objective-C中,你永远不会“取消引用”一个对象指针来设置它的值。

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

答案 3 :(得分: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]];
}];

结帐How do I iterate over an NSArray?

答案 4 :(得分:0)

虽然这可能在某种程度上起作用,但我没有对它进行过测试,我会将其归入“糟糕的主意”而不是触摸。 NSArray和许多其他可可对象相当复杂,并且可以作为类集群设计模式的一部分在引擎盖下进行各种实现。

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

旨在让你弄乱内部的对象通过像NSMutableData的{​​{1}}这样的api方法来揭示它们。

最好使用已处理的值构建新的NS(Mutable)数组。