簡體   English   中英

iPhone Objective-C基本示例問題(關於屬性)

[英]iPhone Objective-C Basic Example Question (about Properties)

抱歉,我無法提供更具描述性的標題。 我的問題(看下面的代碼之后)是什么statusText是。 是IBOutlet還是UILabel? “ @property(保留,非原子)UILabel * statusText”如何工作? 該語句是否表示statusText是屬性???

謝謝回答。 如有任何疑問,請隨時發表評論。

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];  
}

IBOutlet評估結果為零,這只是向Interface Builder暗示它是“連接”。

是的,然后statusText是一個屬性。 屬性(在非“現代運行時”系統上)需要三個語句-一個ivar聲明,一個@property語句和一個synthesize語句。

statusTextUILabel*類型的實例變量。 IBOutlet關鍵字只是使該實例變量可用於Interface Builder。

@property聲明給定屬性的訪問器和/或更改器方法。 等效於聲明-statusLabel-setStatusLabel:方法。

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

另外,您可以自己實現-statusLabel-setStatusLabel:方法。

  • 什么是statusText

statusText是您的代碼示例中的UILabel

  • IBOutlet還是UILabel

都。

UILabel是一種類型(指向您在GUI中使用的UILabel組件的指針)

IBOutlet為Interface Builder應用程序標記了變量,因此它知道將其顯示為Outlet。 在編譯IBOutlet的過程中,它在NSNibDeclarations.h中定義為:

#define IBOutlet

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

您可以手動為變量創建訪問器(獲取器/設置器),而無需使用屬性。 您可以只使用UILabel *statusTextUILabel *statusText實現您的getter / setter方法。

您可以通過將變量定義為@property來使編譯器聲明訪問器,然后使用@synthesize.m文件中創建訪問器,或者再次聲明您自己的訪問器(您可以覆蓋將生成的默認訪問器)

您可以具有readwritereadonly屬性-意味着既可以生成setter也可以生成getter或僅獲取getter。

您可以使用copyretainassign給setter(請參閱有關樹選項復制/保留/分配的內存管理的更多信息)

還有其他一些選項,例如非原子性/原子性,與在訪問之前生成互斥體和鎖定變量等有關(請參閱有關屬性的更多信息

例如,如果您有變量

NSString * string;

將其定義為readwrite屬性,然后綜合生成編譯器即可為您生成:

@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 / setter,定義getter / setter的類型,例如訪問方法,內存管理和鎖定。

我希望這可以解釋您的問題,如果您單擊鏈接,您會找到Apple的解釋,我相信該解釋非常清楚如何使用屬性。

抱歉,格式太糟糕了...

如果像這樣將IBOutlet放在那里,它將允許您在界面生成器中鏈接該項目。

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

然后,您可以在類的代碼中對對象進行更改,它將更改鏈接的對象。 因此,例如,一旦將“ statusText”鏈接到特定的UILabel,就可以在類的代碼中使用statusText.text = @"new text"來修改該項。

另外,IBAction允許您以相同的方式進行鏈接。 您可以將連接從控件的事件拖到文件所有者,然后選擇該類中以IBAction作為返回值的任何方法。

實際上,您的示例中有兩個statusText “事物”。 有一個UILabel類型的statusText對象,並且有一個@synthesize創建的statusText函數。 當您從方法內部使用statusText ,您引用的是對象,而不是函數。 使用self.statusText使用屬性/函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM