Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cocoa 可变到不可变对象_Cocoa - Fatal编程技术网

Cocoa 可变到不可变对象

Cocoa 可变到不可变对象,cocoa,Cocoa,有没有一种方法可以将cocoa中的可变对象转换为不可变对象? 我使用了NSMutableDictionary*mut=[[NSMutableDictionary alloc]initWithDictionary:copyItems:]; 但是这本词典在许多其他地方使用,没有易变的东西 致以最良好的祝愿, SubratNSDictionary Dictionary WithDictionary:如果我正确理解了您的问题(给出了您稍后的注释),您希望将可变对象的不可变副本转换回可变副本 问题似乎是这

有没有一种方法可以将cocoa中的可变对象转换为不可变对象? 我使用了NSMutableDictionary*mut=[[NSMutableDictionary alloc]initWithDictionary:copyItems:]; 但是这本词典在许多其他地方使用,没有易变的东西

致以最良好的祝愿,
Subrat

NSDictionary 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能够处理可变方法,只有编译器不允许您这样做……但您可以执行选择器或其他功能。如果您需要此字典是不可变的(例如,如果您存储它并假定值不会更改),则这种方法可能是危险的