如果我们将NSMutableDictionary存储到NSDictionary中,我们以后可以再次使用它作为NSMutableDictionary吗?

时间:2014-05-08 01:46:21

标签: ios objective-c nsdictionary nsmutabledictionary

如果我们用我们创建的NSMutableDictionary替换NSDictionary实例变量,我们以后可以将它作为NSMictionaryDictionary再次使用它作为NSDictionary吗?

示例:

创建NSMutableDictionary并将其存储到NSDictionary插槽

NSMutableDictionary *muta = [[NSMutableDictionary alloc] initWithObjects:NSArray forKeys:NSArray];
Object.nsDictionary = muta;

稍后获取字典

NSMutableDictionary *muta2 = (NSMutableDictionary*) Object.nsDictionary;
//Do stuff like Add objects with it
[muta2 setObject:id forKey@"key"];

我们是否必须从我们从对象中提取的NSDictionary重新创建一个NSMutableDictionary,还是保留它的“可变性”?您能否告诉我为什么子类对象在替换泛型超类时会保留或不保留其特定的方法和属性?

2 个答案:

答案 0 :(得分:3)

如果您的财产被声明为NSDictionary,那么您不应该对其是否实际上是可变的做出任何假设。

正确的代码应该是:

NSMutableDictionary *muta2 = [Object.nsDictionary mutableCopy];

无论属性中实际存储的字典类型如何,都可以使用。

答案 1 :(得分:0)

在您的问题中,您会混淆两件不同的事情:您指的是分配给实例变量,但显示的代码显示分配给属性。这些都不一样。您似乎也误解分配,将其称为替换对象。

在Objective-C(以及许多其他语言,但不是所有语言)中,对象引用引用。这些引用被分配到变量中。例如在:

NSMutableDictionary *a = [NSMutableDictionary new];
NSMutableDictionary *b = a;

第一个赋值的右侧是一个表达式,它创建一个新对象并返回对该对象的引用。然后将此引用存储到变量a中。第二行复制引用对象,存储在a中并存储到变量b中。

在这两行之后,创建了一个对象和两个变量,并且两个变量都引用完全相同的对象。分配对象的引用不会更改它引用的对象。因此,如果我们现在将代码更改为:

NSMutableDictionary *a = [NSMutableDictionary new];
NSDictionary *b = a;

我们仍然创建了一个对象和两个变量,并且两者仍然引用完全相同的对象。由于NSMutableDictionary是<{1}}的子类,因此允许在这种情况下进行分配 - 类型为NSDictionary的对象也属于NSMutableDictionary类型,它提供与后者相同的所有行为。

从你的问题&#34;你能否告诉我为什么子类对象在替换泛型超类时会保留或不保留其特定的方法和属性?&#34;您需要阅读继承并了解子类的工作原理。

一旦您将子类的引用存储到超类类型变量中,NSDictionarya存储到上面代码中的b,而您仍然无法改变引用的对象你已经失去了直接的知识,即引用实际上是对子类的一个对象 - 你可以立即说明存储在上面b中的一个引用是它引用的对象至少是{{1但是,可能属于NSDictionary的任何子类。

如果您绝对确定,或者就像编写中断的程序一样,您可以告诉编译器相信您NSDictionary包含对b的引用一个演员

NSMutableDictionary

执行此操作并且编译器信任您,但如果NSMutableDictionary *c = (NSMutableDictionary *)b; 未包含对b的引用,那么您对NSMutableDictionary的后续使用可能会无效,您的程序将会中断。

您需要做的是测试引用是否引用c,并使用方法NSMutableDictionary执行此操作:

isKindOfClass:

返回属性:属性是两种方法(假设是读写,您可以拥有只读属性), getter setter < / em>,它结合起来提供变量的抽象 - 你可以&#34;读&#34;和&#34;分配&#34;他们在表达式中使用点表示法。然而,当他们调用方法时,不是对变量执行直接读取或赋值,而是读取或分配该方法可以更改。特别是使用 copy 属性声明的对象类型属性将生成引用的对象的副本。例如:

if ([b isKindOfClass:NSMutableDictionary.class])
{
   // b refers to an NSMutableDictionary
   NSMutableDictionary *c = (NSMutableDictionary *)b;
   // do something with c
}
else
{
   // b does not refer to an NSMutableDictionary
   // handle this case
}

然后@property (copy) NSDictionary *c; ... NSMutableDictionary *a = [NSMutableDictionary new]; NSDictionary *b = a; self.c = a; &amp; a都引用了相同的对象,它是b的一个实例;同时,由于NSMutableDictionary属性copy c , NSDictionary`。

您现在可以看到为什么在您的问题中交替使用实例变量属性是不正确的 - 分配的内容可能会有所不同,具体取决于赋值是否为变量或财产。

您应该阅读对象,对象引用,继承和属性。

HTH。