2009-12-10 54 views
4

self是什麼樣的東西?將它稱爲指針是否正確?或者它是一個變量?還有什麼?自己是一個指針嗎?

+0

自己是一個指針在objective-c ...檢查這個artcle http://cocoabugs.blogspot.com/2011/02/understanding-your-objective-c-self.html – 2011-02-21 06:02:16

回答

15

Objective-C方法的實現實際上只是一個C函數,它需要兩個額外的參數。第一個參數是self變量,第二個參數是用於調用實現的選擇器。第三個和任何後續的參數(如果有的話)是您的方法的實際參數。如果你有這樣的方法:

@implementation MyClass 

- (int) myMethod:(int) anArg 
{ 
    NSLog (@"The selector %@ was used.", NSStringFromSelector(_cmd)); 
    return [self someValue] + anArg; 
} 

@end

然後,大致相當於這個:

// Implementation of MyClass's instance method "myMethod" 
int MyClass_myMethod (id self, SEL _cmd, int anArg) 
{ 
    NSLog (@"The selector %@ was used.", NSStringFromSelector(_cmd)); 
    return [self someValue] + anArg; 
}

但是要記住,在調用C函數和發送郵件有很大的不同。向對象發送消息將導致調用實現,並且該實現由運行時決定。由於方法實現是在運行時確定的,因此編譯器不能簡單地使用直接函數調用交換所有消息發送。我相信有一些方法可以告訴運行時改變給定類的給定選擇器使用哪種方法實現。

運行時間根據self的類確定使用哪個實現。如果selfnil,則發送消息是無操作的,因此,所有方法實現在運行時調用它們時將始終具有有效值self

2

它是類似於C#中的this或VB中的Me。在類的範圍內,它指的是該類的實例化對象。

+1

是的它更像是一個參考比一個指針:它不能(不應該)爲空,並且不能被重新分配指向別的東西。 – ChrisW 2009-12-10 21:17:54

+0

@ChrisW你爲什麼說它不能被重新分配指向別的東西......當這正是初始化過程中發生的情況? – justin 2009-12-10 21:23:45

+0

@Justin - 因爲它'this'不是一個變量。試着看看編譯器是否會讓你編寫像'this = ...;'這樣的東西。 – 2009-12-10 21:35:30

2

像所有對象的指針!

5

self實際上是定義在NSObject

- (id)self; 

所以selfid類型,而這又是在Objective-C的運行時定義的:

typedef struct objc_object { 
    Class isa; 
} *id; 

所以,是的,self只是一個指向Objective-C對象的指針。

有關更多信息,請參閱init method的文檔。

相關問題