self
是您要发送消息的对象。例如,如果您调用类似[foo doSomething]
的方法,则在doSomething
方法中,self
将等于foo
。这是一个传递给方法的隐藏参数。
可能令人困惑的是self
在Objective-C中不是只读的。例如,在初始化,因为你可能会看到,你实际上覆盖self
:
if(self = [super init]){
这是因为[super init]
实际上是有权返回一个完全不同的对象。然而,你只是改变了作为参数传递的变量的值;你没有改变调用该方法的范围中的值。
Foo* foo = [[Foo alloc] init];
// ... may be different of...
Foo* foo = [Foo alloc];
Foo* bar = [foo init];
在这个例子中,在第二种情况下,foo
和bar
实际上可以指向两个不同的对象。 alloc
和init
都返回一个指向一个对象的指针,从技术上讲,它们可能与不同(尽管只有你想保留的那个是返回的那一个init
,因为alloc
指向的对象的返回值不是准备启用)。
如上所述,self
实际上是方法接收的两个隐藏参数之一。另一个隐藏的参数被命名为_cmd
并包含用于调用该方法的选择器。你很少需要它。
这意味着,当你看到这一点:
id bar = [foo doSomethingWithInt:5];
你可以(象征),它解析为一个类似的函数调用:
id bar = Foo_doSomething(foo, @selector(doSomethingWithInt:), 5);
所以self
实际上只是一个说法。
我终于明白了这个概念。非常感谢Hosey先生:D – lampShade 2010-09-11 03:11:47