在Objective-C中,为指定类型的变量赋值时为什么需要强制转换?
这种类型转换的使用经常出现,例如在按钮点击动作中:在Objective-C中,为指定类型的变量赋值时为什么需要强制转换?,objective-c,Objective C,这种类型转换的使用经常出现,例如在按钮点击动作中: UIButton *button = (UIButton *)sender; 我的问题是为什么需要显式强制转换(UIButton*)。将“sender”的值赋给变量“button”是否已经有效地将其转换为指向UIButton的指针?它告诉编译器您知道自己在做什么:“我知道sender从技术上讲不是UIButon*,但我保证它总是在运行时出现。”在objective-c中,编写类似于 - (void)didAction:(id)sender
UIButton *button = (UIButton *)sender;
我的问题是为什么需要显式强制转换(UIButton*)。将“sender”的值赋给变量“button”是否已经有效地将其转换为指向UIButton的指针?它告诉编译器您知道自己在做什么:“我知道
sender
从技术上讲不是UIButon*
,但我保证它总是在运行时出现。”在objective-c中,编写类似于
- (void)didAction:(id)sender
此方法可由任何对象调用(例如UIButton、UIControl等),并预期设置发送者自身
Ever对象是一个id。因此在该方法中,您有一个id类型的变量。如果您确定它是一个按钮,则可以强制转换为UIButton
另一种方法是,如果您确定该方法将仅由UIButton实例调用,则可以将操作方法更改为
- (void)didAction:(UIButton *)senderButton
如果你这样做了,你就不需要施放
请注意,对于您负责的此类铸件,没有任何问题。如果您不确定,可以始终使用
- (BOOL)isKindOfClass:(Class)aClass
方法。正如斯蒂芬所说,实际上并不需要它 但这是一个风格和良好商业惯例的问题 顺便说一句,当你忽略它,你会得到一个警告,而不是一个错误。 为了消除警告,您可以简单地执行以下操作:
someObject = (id) anotherObject;
这将适用于对任何类的任何对象的引用。你看,几乎没有任何铸造完成。
您可以在不强制转换的情况下始终指定给超类:
objectOfAClass = objectOfSubclassOfA;
底线是,它通过强迫你思考一个非常简短的时刻来帮助你避免错误 到目前为止,所有的答案都很好,但我选择这个答案是因为编译器警告的细节。只是重申一下:分配给超类(不强制转换)不会产生任何警告;分配给子类(不强制转换)会生成警告。e、 g.
UILabel*标签;UIView*视图=标签代码>(无警告)<代码>UIView*视图;UILabel*标签=视图代码>(警告)。