4

我想知道这之间有什么区别:

- (IBAction)operationPressed:(UIButton *)sender {

}

和:

- (IBAction)operationPressed:(id)sender {


}

我可以看到 xcode 在使用 id 时尝试为自动完成提供更多额外帮助。那么哪一个是正确使用的,为什么?

谢谢

4

3 回答 3

3

从技术上讲,这并不重要:声明的类型UIButton*不保证不可能调用其他类型的对象。fitt 样式允许您使用UIButton“点语法”访问属性,而第二种样式允许您将处理程序重用于其他 UI 对象,而不会让您的读者想知道发生了什么。

例如,如果您知道您的事件处理程序仅与按钮一起使用,您可以将 sender 的类型声明为UIButton,然后执行以下操作:

- (IBAction)operationPressed:(UIButton *)sender {
    sender.adjustsImageWhenHighlighted = YES;
}

使用第二个声明,您必须这样写:

- (IBAction)operationPressed:(id)sender {
    [sender setAdjustsImageWhenHighlighted:YES];
}

另一方面,如果您计划为不同的 UI 对象重用处理程序,则第二种方法更可取。

于 2013-05-19T10:13:26.873 回答
1

当你用一个特定的类(即UIButton)实现这个方法时,Xcode 会给你更多的帮助。例如,如果您向它无法理解的按钮发送消息,它会自动完成更多内容并且会给您错误。如果编译器只知道发件人是类型id,它将无法帮助您。

另一方面,如果您有多个按钮,其中一些是 的子类UIControl,但不是 的子类,UIButton并且您都希望它们触发operationPressed,那么您可能需要将发送者设置为 typeUIControlid

所以基本上,如果你知道发送者的类型,如果你告诉 Xcode 发送者的类型,生活会更容易。如果您不知道,请使用id.

于 2013-05-19T10:19:52.597 回答
1

id是一种数据类型,它将保存所有其他数据类型,如果您想存储在运行时不知道其类型的东西,这很有用。

如果您确实知道类型(例如这个),最好使用该类型,id因为它使用更少的字节来存储它。

于 2013-05-19T10:13:16.230 回答