通过取消引用更改 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 实际上被设计为不可变的,因此就地编辑甚至是一个坏主意。
旨在让您弄乱内部结构的对象通过NSMutableData
的mutableBytes
等API 方法公开这些对象。
你最好用处理后的值构造一个新的 NS(Mutable)Array。
【讨论】:
以上是关于通过取消引用更改 NSArray 中的值?的主要内容,如果未能解决你的问题,请参考以下文章