目标C:这两个陈述之间有区别吗?

时间:2011-03-10 14:39:56

标签: iphone objective-c ios syntax

设置

@interface Base : NSObject {}
@end

@interface Subclass : Base {}
@end

…

Subclass* sub = …;

之间是否存在差异:

// No explicit cast.
Base* base = sub;

// Explicit cast, but does this actually DO anything different at runtime?
Base* base = (Base*) sub;

4 个答案:

答案 0 :(得分:3)

像处理父类一样处理子类是非常常见且安全的。 (除非你在设计中滥用继承。)演员在运行时不做任何额外的事情,在编译期间不需要;就机器而言,它完全没用。

答案 1 :(得分:0)

会收到有关ClassSuper* super = base;的编译器警告,因为并非每个ClassBase实例都是ClassSuper个实例。所以如果你真的知道你做了什么,你应该做出明确的演员来阻止编译器抱怨。

答案 2 :(得分:0)

Hmmh 警告:不兼容的Objective-C类型初始化'struct AbstractClass *',期望'struct ConcreteClass *'

答案 3 :(得分:-1)

只有当base真正指向instance of ClassSuper时,您的演示声明才有效。由于ClassBase包含更多类型,因此ClassSuper您的广告可能会在运行时失败

您的第一个声明不会失败,因为Objective-C在分配期间并不真正关心类型。因此,ClassSuper* super在运行时期间更像id super。演员虽然会被证实并且如果没有履行则会抛出错误。

相关问题