为什么 IBAction 的发送者类型必须是 id?

Why does an IBAction's sender type have to be id?

我正在使用 "Cocoa Programming For Mac OS X right now (the Objective-C edition)" 学习 Cocoa,每当我使用 Interface Builder 创建按钮时,我都必须将它与我目前正在使用的 classes 之一连接起来.

当我控制从按钮单击并拖动到我的 AppDelegate.h 文件时,Xcode 会自动将按钮挂接到我的 AppDelegate class。如果我选择 "Action" 它将创建一个这样的方法:

- (IBAction)onButtonPress:(id)sender {
}

Objective-C的方法是这样的:

- (returnType)methodName:(typeOfFirstArgument)firstArgumentName (typeOfSecondeArgument)secondArgumentName

为什么我必须为发件人使用类型 id 而不是 NSButton?我知道我用一个按钮连接了这个方法。因此,我希望发件人是 NSButton.

类型的对象

我试过了,但没用。

回答:它不一定是一个 ID,如果您查看弹出的小对话框 select "Action" 并命名处理程序,您会发现您可以 select 对象的实际类型,在您的示例中为 NSButton。

类型不必是 id。您绝对可以更改参数的类型和名称,可以在创建连接时使用弹出窗口,也可以在代码中更改。

id是一个类型,意思是"pointer to any ObjC object"。指向特定 class 的指针同样有效:

- (IBAction)onButtonPress:(NSButton *)importantButton;