为什么在Objective-C中允许[object.delegate self]?

时间:2012-11-29 09:50:08

标签: objective-c cocoa-touch cocoa selector self

我见过几个Objective-C代码示例,其中需要定义委托。例如,使用MapKit时,我会看到如下语句:

[self.mapView.delegate self];

我有时也会看到以下内容:

[self.mapView setDelegate:self];

我仍然找到一些做以下事项的例子:

self.mapView.delegate = self;

我理解第二个和第三个是等价的,但我不明白第一个是如何运行的,更不用说编译了。我的意思是:self在这种情况下如何成为有效的选择器?该代码如何转换为委托属性的赋值语句?

1 个答案:

答案 0 :(得分:11)

self[self.mapView.delegate self];中的

[self.mapView setDelegate:self];不同 - 但相关的事情。虽然后者self表示其范围内的对象,但[object self]是NSObject协议中定义的方法-(id)self

from the doc

  

<强>自
  返回接收者。 (所需的)

- (id)self 
     

返回值接收者。

     

可用性在OS X v10.0及更高版本中可用。

当NSObject类实现NSObject协议时,我们在代码中使用的几乎任何对象都将理解这种方法。

有用的线索,给我们GNUStep documentation

  

自我

- (id) self; 
     

可用性:OpenStep

     

返回接收者。在代理中,这可能(但不是必须)返回代理对象。

我们可以将它用于代理 同样在KVC中,有一个名为self的方法很有用,因为运算符需要一个正确的密钥路径,但实际上对象本身就是我们需要的东西:

NSArray *numbers = @[@1, @1, @2 ,@3, @5]
NSNumber* sum = [numbers valueForKeyPath: @"@sum.self"];

sum将为12


[self.mapView setDelegate:self];self.mapView.delegate = self;是等效的,self发送它所使用的对象。基本上每个Objective-C消息都转换为C函数,至少需要两个参数。 -setDelegate:将在运行时转换为

void setDelegate(id self, SEL _cmd, id delegate)
{
    // implementation ....
} 

正如您在此处所看到的,self只是运行时作为第一个参数传入的对象的默认名称,并且是指定义方法的类的对象。

虽然它通常被称为关键字,但self却不是。这只是一个惯例。由于可以通过使用C函数,实现IMP类型和选择器SEL类型来构造Objective-C方法,因此您可以决定以不同方式调用第一个对象,如果您希望使用C ++命名,则可以调用this。 / p>