2013-06-21 29 views
-1

所以,我剛開始學習Objective-C,並且遇到了這個「自我」的東西。我只用過C,但是我認爲它也可以用在java中呢?有人可以解釋嗎?這裏有一個例子:爲什麼使用「自我」是什麼意思?

- (IBAction)digitPressed:(UIButton *)sender 
{ 
    NSString *digit = [sender currentTitle]; 
    UILabel *myDisplay = [self display]; //why this? 
} 

爲什麼不是這樣?

- (IBAction)digitPressed:(UIButton *)sender 
{ 
     NSString *digit = [sender currentTitle]; 
     UILabel *myDisplay = display; //why not like this? 
} 

顯示器是一個UILabel *

+1

如果您只使用了C語言,並且沒有面向對象的語言,您應該閱讀[*編寫Objective-C代碼*](https://developer.apple.com/library/ios/#referencelibrary/GettingStarted/ RoadMapiOS/chapters/WriteObjective-CCode/WriteObjective-CCode/WriteObjective-CCode.html),是蘋果「開始開發iOS應用程序」指南的一部分。 –

回答

3

[self display],或者self.display,指財產/方法(屬性只是反正的get/set方法的快捷方式),如果你有這樣的事情在.h文件

@property (weak, nonatomic) UILabel* display; 

-(UILabel*)display; 

僅有display,或self->display實例變量。這是有效的,當你宣佈一個實例VAR是這樣的:

@implementation MyClass { 
    UILabel* display; 
} 

如果已經聲明過的屬性display在.h文件中,並沒有改變其默認情況下,相應的實例VAR將_display(注意在這種情況下,以下將是相同的: self.displayself->_display

0

指當前對象,這是在這種情況下,視圖控制器實例,並將其與一個方法名,它是顯示組合,表示您正在發送消息display to self這是視圖控制器。這將調用在您的視圖控制器實例中聲明的方法display

你可以在你的視圖控制器聲明的顯示方法,例如:

- (UILabel)display 
{ 
    //your display method implementation returning UILabel instance 
} 

對於第二個,這意味着你是指顯示變量。例如:

UILabel *display = [[UILabel alloc] init]; 
0

display不是UILabel * - 這可能是一個財產與該類型或方法它返回一個類型的值,但這些相當不同的東西。

您需要閱讀關於面向對象編程的內容。 Objective-C中的self當前對象引用,其他OO語言將其稱爲this - Java和C++都使用該名稱。理解對象和方法是使用這些語言的基礎。

0

這裏有這樣一個很好的解釋: http://useyourloaf.com/blog/2011/02/08/understanding-your-objective-c-self.html

你的問題的關鍵部分是對的Objective-C 2.0點語法部分:

Objective-C的點語法

點語法是Objective-C 2.0引入的,並且產生了很多辯論的 。許多經驗豐富和長時間的可可程序員 建議完全避免它。其他人,如克里斯漢森有一個 關於何時使用屬性和點符號的不同觀點。 無論你在哪個方面下跌,我猜主要的是 是一致的。

反正都懂點語法的主要事情是 以下兩個語句都在做同一件事:

self.timestamp = [NSDate date]; 
[self setTimestamp:[NSDate date]]; 

的點僅僅是更傳統的Objective-快捷方式C方法 調用。任何時候當你看到一個點時,你都可以用等價的方括號方法調用語法替換它。瞭解 是很重要的,但是這與編寫以下內容不同:

timestamp = [NSDate date];如果沒有自己的對象和點,我們不再發送消息的對象,但直接訪問名爲時間戳的伊娃 。由於這繞過了setter方法,因此我們將 覆蓋伊娃的時間戳,而不先釋放舊的NSDate 對象。我們也不會保留我們正在分配的新對象。 這兩種情況都不好!

記住這些例子都沒有使用ARC寫的,所以有很多內存管理的參考,保留,釋放等。然而有用的,看看這些例子,讓你有什麼ARC的一些想法在後臺做着。

在你的例子中,你並沒有引用[self display]的實際顯示屬性,你實際上是指「自我」對象的實例方法,在這種情況下,它是你的UIViewController。

+1

'self.timestamp = ...;'和'[self setTimestamp:...];'之間有非常重要的區別。第一個_將跳過setter到達屬性,第二個_將使用setter,但還有更多:在下面的語句中,如果'customObject'爲零,則'customObject.property = ...;'行將會拋出一個異常並且'[customObject setProperty:...];'不會處於相同的情況。所以我們可以說,根本就不一樣。 – holex

+1

@holex'self.timestamp = ...'和'[self setTimestamp:...]'沒有區別。如[Apple的* Objective-C *書籍編程中的] [「點語法是對訪問器方法調用的簡明替代方法」中所述](https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/ EncapsulatingData/EncapsulatingData.html#// apple_ref/doc/uid/TP40011210-CH5-SW10):**點語法純粹是存取方法調用的方便包裝。在使用點語法時,仍然使用上面提到的getter和setter方法訪問或更改屬性**。 –

+0

@holex'self.timestamp ='是'[self setTimeStamp:...]'的不同語法 - 都調用同一個setter。但是,如果你只是使用'timestamp =',那麼當你跳過setter並直接引用屬性的時候。你的第二個例子是正確的(我相信),但它與正在討論的內容無關。 – siburb

1

在這種情況下,這是一個客觀的C消息的事情。當你看到括號時,它是這樣做的:

[Object Message] 

基本上自我是對象,顯示是你發送它的消息。發送消息就像使用另一種語言的方法調用一樣,但有一點不同。因此,像這樣:

[self doSomethingCool]; 

在客觀C將轉換爲這樣的事情在另一種語言:

this.doSomethingCool(); 
當然

如果在另一個對象中運行的方法,你會與該物體像更換自我:

[myObject doSomethingCool]; 
在很多你並不真的需要有「本」在你的方法調用的前面,它暗示了,如果你不包括它,你正在運行的方法語言

OB與你合作的項目。當我開始使用類似的東西時,我很早就被燒傷了。我有一個數據層方法的調用,你可以保存一個對象,它會給你一個整數。當我保存對象時,我沒有把自己放在方法調用的前面,它本質上是生成一個新對象並保存它,並且我沒有得到正確的整數。

使用「自我」只是明確告訴它「我正在使用這個對象」。與屬性相同的東西,我總是使用「self.MyProperty」而不是「MyProperty」,因爲我想明確並確保使用我正在工作的對象的MyProperty。對於像這樣的缺陷擊中你,你期望使用某個物體,環境認爲你正在使用另一個物體,但是當你碰到一個人時,這是一個頭部劃傷者,因爲一切都看起來很正確。