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