在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*标签=视图(警告)。