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

use*_*723 3 cocoa cocoa-touch objective-c self selector

我已经看到了几个Objective-C代码示例,其中需要定义委托.例如,在使用MapKit时,我会看到如下语句:

[self.mapView.delegate self];
Run Code Online (Sandbox Code Playgroud)

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

[self.mapView setDelegate:self];
Run Code Online (Sandbox Code Playgroud)

我仍然找到一些执行以下操作的示例:

self.mapView.delegate = self;
Run Code Online (Sandbox Code Playgroud)

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

Vik*_*ica 11

self[self.mapView.delegate self];[self.mapView setDelegate:self];不同 - 但相关的事情.而后者self代表其使用范围内的对象,[object self]-(id)selfNSObject协议中定义的方法.

来自文档:

self
返回接收器.(需要)

- (id)self 
Run Code Online (Sandbox Code Playgroud)

返回值接收器.

可用性适用于OS X v10.0及更高版本.

由于NSObject类实现了NSObject协议,因此我们在代码中使用的几乎任何对象都将理解此方法.

一个线索,它有用的,给我们GNUStep文档:

- (id) self; 
Run Code Online (Sandbox Code Playgroud)

可用性:OpenStep

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

我们可以将它用于代理.
同样在KVC中,有一个被调用的方法很有用self,因为操作符需要一个正确的键路径,但实际上对象本身就是我们需要的:

NSArray *numbers = @[@1, @1, @2 ,@3, @5]
NSNumber* sum = [numbers valueForKeyPath: @"@sum.self"];
Run Code Online (Sandbox Code Playgroud)

sum会的12.


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

void setDelegate(id self, SEL _cmd, id delegate)
{
    // implementation ....
} 
Run Code Online (Sandbox Code Playgroud)

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

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