众所周知,[self setDate:...]
表示self
是接收者,setDate:
是消息。那么发件人呢?
我设置了一个包含操作(IBAction)buttonPressed:(id)sender
的按钮。我知道这个按钮是目标,buttonPressed
是动作。那么哪个可以是sender
?
答案 0 :(得分:4)
1)据我所知,
[self setDate:...]
表示self
是接收者,setDate:
是消息。那么发件人呢?
发件人是发送邮件的对象 - 如果有的话。
那是哪一个?
您在函数,类方法或实例方法中编写了该语句。
如果它是一个实例方法,无论哪个对象调用该方法 - 即收到 消息 - 是setDate:
消息的发送者。
例如,如果您从NSWindowController子类中的名为setDate:
的实例方法发送了buttonPressed:
消息,那么您的窗口控制器 - 收到的实例(对象) buttonPressed:
消息是发送setDate:
消息的对象。
当然,如果邮件的收件人是self
,那么您就是将邮件发送给自己,因此您既是收件人又是发件人。
2)我设置了一个带动作的按钮(IBAction)buttonPressed:(id)sender。我知道这个按钮是目标,而buttonPressed是动作。
都能跟得上!按钮不是目标;按钮具有目标,这是另一个对象。目标是接收操作消息的对象。
想想射箭目标。目标不发送箭头!它接收箭头。
那么哪个可以是发件人?
sender
变量引用的对象通常是发送消息的对象。
通常,它是一个控件(如按钮)或菜单项:按下时,控件或菜单项将其动作消息发送到其目标,将其自身(控件或菜单项)作为“发送者”传递。
因此,您的按钮会向其目标发送一条消息,该消息是设置为按钮操作的消息,并且因为它正在发送消息,所以它会自动传递为sender
。
查看sender
的唯一理由是检查发件人的tag
或representedObject
。一个动作方法是关于发送者可能需要关心的唯一一种方法(这就是为什么它有这个参数),即便如此,通常也不是。
答案 1 :(得分:0)
发件人是预先形成任务的对象....假设您的示例(IBAction)buttonPressed:
如果您按下按钮,该按钮正在发送以下任何代码。看我的例子
- (IBAction)pushButton:(id)sender {
UIButton *pushedButton = (UIButton *)sender;
[button setTitle:@"Press me to Send" forState:UIControlStateNormal];
}
答案 2 :(得分:0)
1)是的,self
是消息的接收者,setDate:
是消息(方法调用)。没有“发件人”。无论如何,“发件人”是什么意思?
2)在代码中,设置按钮以调用buttonPressed:
方法的方法如下:
[someButton addTarget:someTarget action:@selector(buttonPressed:) forControlEvents: UIControlEventTouchUpInside];
someTarget
通常是self
。 “目标”是具有“动作”方法的对象。该方法如下:
- (void)buttonPressed:(UIButton *)button {
}
“someButton”是“发件人”,因为它是具有该事件的按钮。
答案 3 :(得分:0)
实际上,在客观消息传递系统中,没有任何关于"发送者"的正式概念。
(IBAction为)buttonPressed:(ID)发送者。
这里发送者只是普通的方法参数,而不是目标c消息系统的一部分。只需在Appkit或UIKIt中命名一个方式参数。
[self setDate:...] 在这里"自我"是接收者和setDate:是消息。
请注意:在普通演讲中发送消息"意味着三件事:发送者,接收者和消息。发送者是包含消息的功能或代码块。但这种类比不适用于目标c。