![](/img/trans.png)
[英]Question about delegation in Objective-C, CLLocationManager
[英]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
語句。
statusText
是UILabel*
類型的實例變量。 IBOutlet
關鍵字只是使該實例變量可用於Interface Builder。
@property
聲明給定屬性的訪問器和/或更改器方法。 等效於聲明-statusLabel
和-setStatusLabel:
方法。
您可以使用@synthesize
自動實現這些-statusLabel
和-setStatusLabel:
方法。 nonatomic
和retain
關鍵字定義了這些自動生成的方法的行為。
另外,您可以自己實現-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 *statusText
並UILabel *statusText
實現您的getter / setter方法。
您可以通過將變量定義為@property
來使編譯器聲明訪問器,然后使用@synthesize
在.m
文件中創建訪問器,或者再次聲明您自己的訪問器(您可以覆蓋將生成的默認訪問器)
您可以具有readwrite
或readonly
屬性-意味着既可以生成setter也可以生成getter或僅獲取getter。
您可以使用copy
, retain
或assign
給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.