我见过几个Objective-C代码示例,其中需要定义委托。例如,使用MapKit时,我会看到如下语句:
[self.mapView.delegate self];
我有时也会看到以下内容:
[self.mapView setDelegate:self];
我仍然找到一些做以下事项的例子:
self.mapView.delegate = self;
我理解第二个和第三个是等价的,但我不明白第一个是如何运行的,更不用说编译了。我的意思是:self
在这种情况下如何成为有效的选择器?该代码如何转换为委托属性的赋值语句?
答案 0 :(得分:11)
self
和[self.mapView.delegate self];
中的 [self.mapView setDelegate:self];
不同 - 但相关的事情。虽然后者self表示其范围内的对象,但[object self]
是NSObject协议中定义的方法-(id)self
。
<强>自强>
返回接收者。 (所需的)- (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>