我想知道这之间有什么区别:
- (IBAction)operationPressed:(UIButton *)sender {
}
和:
- (IBAction)operationPressed:(id)sender {
}
我可以看到 xcode 在使用 id 时尝试为自动完成提供更多额外帮助。那么哪一个是正确使用的,为什么?
谢谢
从技术上讲,这并不重要:声明的类型UIButton*
不保证不可能调用其他类型的对象。fitt 样式允许您使用UIButton
“点语法”访问属性,而第二种样式允许您将处理程序重用于其他 UI 对象,而不会让您的读者想知道发生了什么。
例如,如果您知道您的事件处理程序仅与按钮一起使用,您可以将 sender 的类型声明为UIButton
,然后执行以下操作:
- (IBAction)operationPressed:(UIButton *)sender {
sender.adjustsImageWhenHighlighted = YES;
}
使用第二个声明,您必须这样写:
- (IBAction)operationPressed:(id)sender {
[sender setAdjustsImageWhenHighlighted:YES];
}
另一方面,如果您计划为不同的 UI 对象重用处理程序,则第二种方法更可取。
当你用一个特定的类(即UIButton
)实现这个方法时,Xcode 会给你更多的帮助。例如,如果您向它无法理解的按钮发送消息,它会自动完成更多内容并且会给您错误。如果编译器只知道发件人是类型id
,它将无法帮助您。
另一方面,如果您有多个按钮,其中一些是 的子类UIControl
,但不是 的子类,UIButton
并且您都希望它们触发operationPressed
,那么您可能需要将发送者设置为 typeUIControl
或id
。
所以基本上,如果你知道发送者的类型,如果你告诉 Xcode 发送者的类型,生活会更容易。如果您不知道,请使用id
.
id
是一种数据类型,它将保存所有其他数据类型,如果您想存储在运行时不知道其类型的东西,这很有用。
如果您确实知道类型(例如这个),最好使用该类型,id
因为它使用更少的字节来存储它。