我刚刚开始使用Objective-C,我对一个功能有疑问。
假设我有一个接受并存储NSDictionary
对象的方法,并且我提供了NSMutableDictionary
(毕竟,NSDictionary
)。此方法将其存储在对象内的NSDictionary
属性中,因此对象的类型实际上变为NSDictionary
。这意味着用于向NSMutableDictionary添加对象的选择器不再存在。
我来自C ++背景,虽然我不应该尝试在C ++实践中映射Objective-C实践,但这看起来与在C ++中处理const
的方式非常相似(即,如果你通过了对于接受相同类型的const
变体的方法非const
,该对象在方法(以及实例)范围内变为const
。
有人可以开导我吗?
谢谢,
托马索
答案 0 :(得分:1)
这部分问题:
此方法将其存储在对象中
NSDictionary
属性中,因此对象的类型实际上变为NSDictionary
。
...是假的。不进行类型转换。该对象仍然是NSMutableDictionary
,它不再是界面显式的。
Objective-C对象在运行时是无类型的。打字是为了您作为程序员的利益,并允许编译器生成适当的警告。转换指针与在C ++中转换指针具有完全相同的效果 - 它与指向的东西没有任何区别。在这种情况下,您所做的就是将指向可变事物的指针转换为指向不可变事物的指针(就编译器而言,这是一个超类,因此允许强制转换)。
如果要获取可变对象的不可变副本,请使用copy
。 copy
始终返回不可变副本,即使原始文件是可变的,也需要mutableCopy
来进行可变副本。使用copy
修饰符声明属性,以便为您完成前者。不要担心不必要地复制已经不可变的对象 - 他们将自己作为副本返回(执行适当的内存所有权簿记)。