Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.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
Iphone 目标C:这两种说法有区别吗?_Iphone_Objective C_Ios_Syntax - Fatal编程技术网

Iphone 目标C:这两种说法有区别吗?

Iphone 目标C:这两种说法有区别吗?,iphone,objective-c,ios,syntax,Iphone,Objective C,Ios,Syntax,设置: @interface Base : NSObject {} @end @interface Subclass : Base {} @end … Subclass* sub = …; 以下两者之间是否有区别: // No explicit cast. Base* base = sub; 以及: 您将得到一个关于ClassSuper*super=base的编译器警告因为不是每个ClassBase实例都是ClassSuper实例。所以,若你们真的知道你们在做什么,你们应该进行显式转换

设置

@interface Base : NSObject {}
@end

@interface Subclass : Base {}
@end

…

Subclass* sub = …;
以下两者之间是否有区别:

// No explicit cast.
Base* base = sub;
以及:

您将得到一个关于
ClassSuper*super=base的编译器警告因为不是每个
ClassBase
实例都是
ClassSuper
实例。所以,若你们真的知道你们在做什么,你们应该进行显式转换来阻止编译器抱怨。

Hmmh
警告:不兼容的Objective-C类型初始化“struct AbstractClass*”,预期为“struct ConcreteClass*”

只有当
base
确实指向ClassSuper的
实例时,您的强制转换语句才有效。由于
ClassBase
包含更多类型,因此
ClassSuper
您的强制转换可能会在运行时失败


不过,您的第一个语句不会失败,因为Objective-C在赋值过程中并不真正关心类型。因此,在运行时,您的
ClassSuper*super
更像是一个
id super
。强制转换将得到验证,如果未实现,将抛出错误。

将子类视为其父类是非常常见和安全的。(除非您在设计中误用了继承。)强制转换在运行时不做任何额外的事情,在编译期间也不需要;就机器而言,它是完全无用的。

最好检查
是否属于类:
而不是在没有验证的情况下铸造。这就是为什么我说“如果你真的知道你在做什么”。这个演员阵容的背景在技术上是不相关的,但我承认从教育学的角度来看,你是对的:)。基类和超类是同义词——你到底在演示什么,上流还是下流?别生气。它们是问题中使用的类名。在我回答后,OP&zoul对名称和语义进行了编辑-参见第一次修订是的,我得到了super和base混淆了我的bad。。我现在就编辑啊!所以您是说在运行时存在差异。强制转换是动态验证的?否。强制转换是编译时构造,仅此而已。这样的强制转换不会生成运行时代码。它根本不会更改生成的代码。
// Explicit cast, but does this actually DO anything different at runtime?
Base* base = (Base*) sub;