2009-12-21 68 views
1

對不起,我不能給一個更具描述性的標題。我的問題(看下面的代碼後)是什麼statusText是。它是IBOutlet還是UILabel? 「@property(保留,非原子)UILabel * statusText」如何工作?這個聲明是否意味着statusText是一個屬性?iPhone Objective-C基本示例問題(關於屬性)

感謝您的回答。如有任何問題,請隨時發表評論。

Button_FunViewController.h

@interface Button_Fun2ViewController : UIViewController { 
    IBOutlet UILabel *statusText; 
} 
@property (retain,nonatomic) UILabel *statusText; 
- (IBAction)buttonPressed: (id)sender; 

Button_FunViewController.m

@synthesize statusText; 

- (IBAction)buttonPressed: (id)sender { 
    NSString *title = [sender titleForState:UIControlStateNormal]; 
    NSString *newText = [[NSString alloc] initWithFormat:@"%@ button was pressed.", title]; 
    statusText.text = newText; 
    [newText.release]; 
} 
+0

基於前2個答案,我猜這意味着statusText是一個UILabel不屬性。那麼爲什麼「@屬性(保留,非原子)UILabel * statusText」,爲什麼沒有這個聲明使它成爲一個屬性? – Devoted 2009-12-21 03:23:36

+0

爲什麼一個物體不能成爲一個物體?也就是說,爲什麼不能將statusText作爲UILabel類型的對象,仍然是一個屬性? – refulgentis 2009-12-21 03:25:32

+0

和@property是*必要*使其成爲一個屬性,但不*充分*。 – refulgentis 2009-12-21 03:26:04

回答

2

IBOutlet中的計算結果不了了之,它只是界面生成器,這是一個 '連接' 的提示。

是的,statusText是一個屬性然後。一個屬性需要三個語句(在非「現代運行時」系統上) - 伊娃聲明,@property聲明和synthesize聲明。

0

如果您將IBOutlet放在那裏,它將允許您在界面構建器中鏈接該項目。

一旦您設置了IBOutlet,您可以打開該類的筆尖,然後選擇文件的所有者,然後轉到檢查器並將鏈接從連接選項卡拖動到該對象。

這讓我們改變你的類的代碼中的對象,它會改變鏈接的對象。因此,例如,一旦將「statusText」鏈接到特定的UILabel,您可以在您的課程代碼中使用statusText.text = @"new text"來修改該項目。

此外,IBAction允許您以相同的方式建立鏈接。您可以將連接從控件的事件拖到文件所有者,然後選擇該類中具有IBAction作爲返回值的任何方法。

2

statusTextUILabel*類型的實例變量。 IBOutlet關鍵字只是簡單地將該實例變量提供給Interface Builder。

@property聲明給定屬性的存取器和/或增變器方法。這相當於宣佈了-statusLabel-setStatusLabel:方法。

您可以使用@synthesize來自動實施這些-statusLabel-setStatusLabel:方法。 nonatomicretain關鍵字定義了這些自動生成的方法的行爲。

或者,您可以自己實施-statusLabel-setStatusLabel:方法。

+0

是的,但「@property」聲明的目的是什麼?另外,我該如何使用該物業? – Devoted 2009-12-21 03:55:11

+2

其目的是聲明您的課程的公開訪問屬性。通常,屬性對應於私有實例變量,但他們不必。 – Darren 2009-12-21 03:58:04

+0

但在這個例子中,它沒有做任何事我猜。因爲我刪除了「@屬性」和「@synthesize」,它仍然有效。 – Devoted 2009-12-21 04:00:24

0

在你的例子中實際上有兩個statusText「東西」。有一個statusText類型的UILabel對象,並且有statusText函數由@synthesize創建。當您在方法中使用statusText時,您正在接觸對象,而不是函數。使用self.statusText來使用屬性/功能。

+0

從技術上講,這是一種方法,而不是一種功能。 /狡辯 – 2009-12-21 09:23:08

2
  • 什麼是statusText

statusTextUILabel在你的代碼示例

  • 它是一個IBOutletUILabel

兩者。

UILabel是一種類型的(一個指針到在GUI使用UILabel成分)

IBOutlet標記變量用於接口Builder應用,以便它知道它顯示爲出口。在編譯期間IBOutlet中被編出來,它在NSNibDeclarations.h被定義爲:

#define IBOutlet

  • 如何@property (retain,nonatomic) UILabel *statusText工作?

您可以手工爲變量創建訪問器(getters/setters),不需要使用屬性。你可以只有UILabel *statusText並親自實施你的getter/setter。

您可以通過定義變量作爲@property由編譯器聲明的訪問器,然後要麼使用@synthesize.m文件中創建存取或再次聲明瞭存取自己(可以覆蓋將要生成默認存取)

你可以有readwritereadonly屬性 - 這意味着setter和getter都被生成或者只有getter。

您可以使用copyretainassign進行setter(看更多的內存管理有關樹optons複製/保留/分配)

還有一些其他的選項,如非原子/原子具有與產生互斥做並獲得前鎖變量等(詳見about properties

例如,如果你有可變

NSString * string;

將其定義爲讀寫屬性,然後合成你的編譯器爲你:

@property (copy, readwrite) NSString * string 

然後使用

@synthesize string; 

產生類似:

- (NSString *) string 
{ 
    return string; 
} 

- (void)setString:(NSString *)str 
{ 
    NSString * copy = [str copy]; 
    [string release]; 
    string = copy; 
} 
  • 這是否聲明意思是 statusText是屬性???

是的,你把它定義爲一個屬性,如上所述。

這裏涉及到幾個概念。 定義變量,將其定義爲Interface Builder的IBOutlet,將變量聲明爲屬性,以便編譯器爲您生成getter/setters,定義getter/setter類型,如訪問方法,內存管理和鎖定。

我希望這可以解釋你的問題,如果你按照鏈接,你會發現蘋果的解釋,我相信這是非常清楚如何使用屬性。

對不起,可怕的格式...