我遇到了与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中使用,但我不明白为什么它在这里不起作用!在此先感谢您的帮助!
答案 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]];
}];
答案 4 :(得分:0)
虽然这可能在某种程度上起作用,但我没有对它进行过测试,我会将其归入“糟糕的主意”而不是触摸。 NSArray和许多其他可可对象相当复杂,并且可以作为类集群设计模式的一部分在引擎盖下进行各种实现。
因此,当它归结为它时,你真的不知道你在内部处理什么。实际上,NSArray被设计为不可变的,所以编辑甚至是一个坏主意。
旨在让你弄乱内部的对象通过像NSMutableData
的{{1}}这样的api方法来揭示它们。
最好使用已处理的值构建新的NS(Mutable)数组。