2013-02-08 41 views
7

我開始學習如何在一分鐘的iOS開發和我目前有Apress開始我正在努力的IOS6書。iOS - 開始iOS教程 - 在變量之前加下劃線?

在第二章中有一個簡單的教程,用於顯示兩個按鈕和一個標籤,當按下按鈕時,它會在標籤上顯示哪一個被按下。

我已經完成了本教程,但它提出了一個問題,我找不到答案。

本教程使用ARC(自動引用計數)的情況下,有所作爲。

下面是代碼,

頭文件:

#import <UIKit/UIKit.h> 

@interface MTMViewController : UIViewController 


@property (weak, nonatomic) IBOutlet UILabel *statusLabel; 


- (IBAction)buttonPressed:(UIButton *)sender; 

@end 

和M檔:

#import "MTMViewController.h"  

@implementation MTMViewController 

- (IBAction)buttonPressed:(UIButton *)sender { 


    NSString *title = [sender titleForState:UIControlStateNormal]; 

    NSString *plainText = [NSString stringWithFormat:@"%@ button pressed.", title]; 

    statusLabel.text = plainText; 


} 

@end 

以上就是它如何出現在書中,但在做的時候在Xcode教程我不能編譯以下行:

statusLabel.text = plainText; 

,而是必須將其更改爲:

_statusLabel.text = plainText; 

當我做到了這一點編譯的代碼和運行得很好,我試圖要回通過教程,看看我是否錯過了什麼,但要弄清楚爲什麼會這樣我什麼也沒看見。

任何人都可以解釋爲什麼書中的代碼沒有編譯,爲什麼我不得不將下劃線添加到變量的前面?這是正確的還是我做錯了什麼?

+1

有「@synthesize」的概念來產生getter和setters。如果使用「@synthesize」聲明該屬性,則可以使用相同的名稱直接訪問該屬性。僅供參考。 –

+0

@Jennis我真的不會推薦這麼做,因爲這會對你是否訪問底層變量或通過生成的getter/setter造成混淆。對不同的訪問方式使用不同的名稱可以明確代碼的作用和理由。如果使用舊版本的Xcode,其中'@ synthesize'對屬性是強制性的,我建議使用'@synthesize statusLabel = _statusLabel'形式。 – WDUK

回答

11

原因statusLabel.text = plainText;失敗是因爲您沒有正確訪問屬性。爲了通過生成的getters/setter來訪問它,你需要在它前面加上self.,因爲屬性(及其setter/getters)屬於self的實例。所以相反,它將是self.statusLabel.text = plainText;

原因_statusLabel工作是因爲這是保留該屬性的值的基礎變量。當以這種方式訪問​​變量時,您正在規避生成的setter/getters。通常,您應該使用self.propertyName,因爲這將尊重您作爲屬性定義一部分提供的關鍵字(如果您使用atomic關鍵字,一個很好的例子是,因爲生成的設置器和獲取器將正確地將@synchronized塊放置在底層實例周圍變量)。

如果您沒有手動合成您的屬性(這是一件好事,以前人們已手動合成),Xcode的最新版本會創建具有預先下劃線的變量名稱。如果您願意,您可以使用@synthesize statusLabel = m_statusLabel來定義您自己的潛在變量名稱。這意味着您可以使用m_statusLabel而不是_statusLabel來訪問它。除非有迫切需要,否則通常不需要這樣做;蘋果建議使用前綴下劃線。

在初始化方法和取消分配方法時,您應該使用基礎變量,因爲在此時代碼中生成的setter/getters可能不完整。

+0

非常好,謝謝你,很棒的信息。所以我猜這本書中的代碼是不正確的,在閱讀本書未來的章節時,我應該使用self.property? –

+1

如果您發佈的代碼與本書完全相同,那麼是的,這本書是錯誤的。你應該使用'self.statusLabel'。我可以看到他們已經滑落的位置;當我提到人們必須手動合成屬性時,可以使用'@synthesize statusLabel'。這會創建一個名爲'statusLabel'的底層變量,這會加劇混淆你是否使用生成的setter/getters或底層變量的未經訓練的眼睛! – WDUK

+0

其實我忽略了一個不在書中的東西,而是在這本書的源代碼中@synthesize statusLabel;在.m文件中,這是你在那裏說的。我仍然有點困惑,我最好使用self.property方法還是[@]綜合屬性方法? –