将NSMutable *对象传递给接受NS *对象的方法时会发生什么?

时间:2014-07-09 00:52:31

标签: c++ objective-c const parameter-passing immutability

我刚刚开始使用Objective-C,我对一个功能有疑问。 假设我有一个接受并存储NSDictionary对象的方法,并且我提供了NSMutableDictionary(毕竟,NSDictionary)。此方法将其存储在对象内的NSDictionary属性中,因此对象的类型实际上变为NSDictionary。这意味着用于向NSMutableDictionary添加对象的选择器不再存在。

我来自C ++背景,虽然我不应该尝试在C ++实践中映射Objective-C实践,但这看起来与在C ++中处理const的方式非常相似(即,如果你通过了对于接受相同类型的const变体的方法非const,该对象在方法(以及实例)范围内变为const

有人可以开导我吗?

谢谢,
托马索

1 个答案:

答案 0 :(得分:1)

这部分问题:

  

此方法将其存储在对象中NSDictionary属性中,因此对象的类型实际上变为NSDictionary

...是假的。不进行类型转换。该对象仍然是NSMutableDictionary,它不再是界面显式的。

Objective-C对象在运行时是无类型的。打字是为了您作为程序员的利益,并允许编译器生成适当的警告。转换指针与在C ++中转换指针具有完全相同的效果 - 它与指向的东西没有任何区别。在这种情况下,您所做的就是将指向可变事物的指针转换为指向不可变事物的指针(就编译器而言,这是一个超类,因此允许强制转换)。

如果要获取可变对象的不可变副本,请使用copycopy始终返回不可变副本,即使原始文件是可变的,也需要mutableCopy来进行可变副本。使用copy修饰符声明属性,以便为您完成前者。不要担心不必要地复制已经不可变的对象 - 他们将自己作为副本返回(执行适当的内存所有权簿记)。