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
返回接收器.(需要)Run Code Online (Sandbox Code Playgroud)- (id)self返回值接收器.
可用性适用于OS X v10.0及更高版本.
由于NSObject类实现了NSObject协议,因此我们在代码中使用的几乎任何对象都将理解此方法.
一个线索,它有用的,给我们GNUStep文档:
自
Run Code Online (Sandbox Code Playgroud)- (id) self;可用性: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++命名一样.