已发送消息或收到消息?

时间:2013-05-16 01:46:42

标签: objective-c

  1. 众所周知,[self setDate:...]表示self是接收者,setDate:是消息。那么发件人呢?

  2. 我设置了一个包含操作(IBAction)buttonPressed:(id)sender的按钮。我知道这个按钮是目标,buttonPressed是动作。那么哪个可以是sender

4 个答案:

答案 0 :(得分:4)

  

1)据我所知,[self setDate:...]表示self是接收者,setDate:是消息。那么发件人呢?

发件人是发送邮件的对象 - 如果有的话。

那是哪一个?

  1. 您在声明中写了这封邮件。
  2. 您在函数,类方法或实例方法中编写了该语句。

    • 如果它是一个函数,则没有对象是发件人。
    • 如果它是一个类方法,可以说这个类是发送者(取决于你认为类多少是对象)。
    • 如果它是一个实例方法,无论哪个对象调用该方法 - 即收到 消息 - 是setDate:消息的发送者。

      例如,如果您从NSWindowController子类中的名为setDate:实例方法发送了buttonPressed:消息,那么您的窗口控制器 - 收到的实例(对象) buttonPressed:消息是发送setDate:消息的对象。

  3. 当然,如果邮件的收件人是self,那么您就是将邮件发送给自己,因此您既是收件人又是发件人。

      

    2)我设置了一个带动作的按钮(IBAction)buttonPressed:(id)sender。我知道这个按钮是目标,而buttonPressed是动作。

    都能跟得上!按钮不是目标;按钮具有目标,这是另一个对象。目标是接收操作消息的对象。

    想想射箭目标。目标不发送箭头!它接收箭头。

      

    那么哪个可以是发件人?

    sender变量引用的对象通常是发送消息的对象。

    通常,它是一个控件(如按钮)或菜单项:按下时,控件或菜单​​项将其动作消息发送到其目标,将其自身(控件或菜单​​项)作为“发送者”传递。

    因此,您的按钮会向其目标发送一条消息,该消息是设置为按钮操作的消息,并且因为它正在发送消息,所以它会自动传递为sender

    查看sender的唯一理由是检查发件人的tagrepresentedObject。一个动作方法是关于发送者可能需要关心的唯一一种方法(这就是为什么它有这个参数),即便如此,通常也不是。

答案 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。