Cocoa 可变到不可变对象
有没有一种方法可以将cocoa中的可变对象转换为不可变对象? 我使用了NSMutableDictionary*mut=[[NSMutableDictionary alloc]initWithDictionary:copyItems:]; 但是这本词典在许多其他地方使用,没有易变的东西 致以最良好的祝愿,Cocoa 可变到不可变对象,cocoa,Cocoa,有没有一种方法可以将cocoa中的可变对象转换为不可变对象? 我使用了NSMutableDictionary*mut=[[NSMutableDictionary alloc]initWithDictionary:copyItems:]; 但是这本词典在许多其他地方使用,没有易变的东西 致以最良好的祝愿, SubratNSDictionary Dictionary WithDictionary:如果我正确理解了您的问题(给出了您稍后的注释),您希望将可变对象的不可变副本转换回可变副本 问题似乎是这
SubratNSDictionary Dictionary WithDictionary:如果我正确理解了您的问题(给出了您稍后的注释),您希望将可变对象的不可变副本转换回可变副本 问题似乎是这样的:
NSMutableString *foo = [NSMutableString stringWithString:@"a mutable object"];
NSMutableDictionary *dictionary1, *dictionary2;
dictionary1 = [NSMutableDictionary dictionaryWithObject:foo forKey:@"foo"];
dictionary2 = [[NSMutableDictionary alloc]initWithDictionary:dictionary1
copyItems: YES];
[[dictionary1 objectForKey:@"foo"] appendString:@", mutated"];
[[dictionary2 objectForKey:@"foo"] appendString:@", mutated"];
我们可以很好地修改dictionary1中的对象,但对dictionary2执行相同操作会引发异常
这是因为尽管NSMutableDictionary的initWithDictionary:copyItems:方法生成dictionary对象的可变副本,但它生成其内容的不可变副本
区分不可变和不可变版本的类(如cocoa的基本字符串、数组和字典类)应该实现copyWithZone:和mutableCopyWithZone:方法。由于并非所有类都实现mutableCopyWithZone:方法,因此NSMutableDictionary的initWithDictionary:copyItems:方法不可变地复制dictionary1的每个内容,这意味着dictionary2包含不可变的对象
通过向不可变对象发送mutableCopy消息,可以创建不可变对象的可变副本。但可能更好的解决方案是向NSMutableDictionary添加一个initWithDictionary:mutableCopyItems:方法,其中包含一个类别:
- (id) initWithDictionary:(NSDictionary *)otherDictionary
mutableCopyItems:(BOOL)flag
{
if (flag) {
self = [self init];
if (self)
for (id key in otherDictionary){
id object = [otherDictionary objectForKey:key];
if ([object respondsToSelector:@selector(mutableCopyWithZone:)])
[self setObject:[object mutableCopy] forKey:key];
else
[self setObject:[object copy] forKey:key];
}
}
else
self = [self initWithDictionary:otherDictionary];
return self;
}
如果您想知道copy、mutableCopy、copyWithZone:和mutableCopyWithZone之间的区别,请阅读以下内容:
这可能是一个过于简单的答案,但是:
NSMutableDictionary * mutableDictionary = [NSMutableDictionary dictionaryWithStuff....];
NSDictionary * dictionary = mutableDictionary;
//from this point on, only use dictionary
虽然
dictionary
在技术上(内部)是可变的,但您将无法访问set
方法,因为这些方法都是NSMutableDictionary
上的方法。好的,让我详细介绍一下。我有一份NSMUTABLE字典的清单。我正在复制NSMutableDictionary并将其作为新条目放入列表中。但是,每当我在复制的文件中做一些更改时,这些更改也会反映在原始文件中。为此,尝试使用NSMutableDictionary*mut=[[NSMutableDictionary alloc]initWithDictionary:copyItems:];但这也不起作用。一旦复制了词典,我以后就无法对词典的一个值执行操作,因为这是可变到不可变的转换。有什么办法吗?如果字典被转换成NSMutableDictionary,比如:(NSMutableDictionary*)dictionary,这不是真的吗。NSMutableDictionary casted to dictionary能够处理可变方法,只有编译器不允许您这样做……但您可以执行选择器或其他功能。如果您需要此字典是不可变的(例如,如果您存储它并假定值不会更改),则这种方法可能是危险的