[英]@synthesize IBOutlet property
我是 Objective-C 新手,正在閱讀 Alasdair Allan 的“iPhone 編程”。 在閱讀時,我發現了這段代碼:
@interface RootController : UIViewController <UITableViewDataSource, UITableViewDelegate> {
UITableView *tableView;
NSMutableArray *cities;
}
// warning: remember this tableView
@property (nonatomic, retain) IBOutlet UITableView *tableView;
相對實現以這種方式開始:
@implementation RootController
@synthesize tableView;
現在:我了解到@synthesize 是一種避免無聊的 getter 和 setter 的捷徑。
但我有一個問題:
IBOutlets 是否必須被合成?
當加載 nib 文件並建立 outlets 時,nib 加載機制總是使用訪問器方法(如果它們存在)(在 Mac OS X 和 iOS 上)。 因此,無論您為哪個平台開發,您通常都應該使用 Objective-C 聲明的屬性功能聲明插座。
對於 iOS,您應該使用:
@property(非原子,保留)IBOutlet UIUserInterfaceElementClass *anOutlet;
然后你應該要么合成相應的訪問器方法,要么根據聲明實現它們,並(在iOS中)釋放dealloc中的相應變量。
在實現 tableView 的代碼中從未顯式調用,但 dealloc 釋放它;
那是因為當您為 tableView 分配值時,您的 controller 會保留它,並且在它被釋放時需要釋放它。 不要忘記,在接口中聲明的@properties 是可以公開訪問的。 具體而言,您聲明為 IBOutlet 的 tableView 由視圖 controller loadView
方法使用您在 Interface Builder 中定義的文件所有者和 UITableView 之間的連接進行初始化。
如果它永遠不會被明確調用,為什么@synthesize?
您需要為所有聲明的@properties 提供訪問器。 它們可以是@synthesized,也可以自己編寫。
IBOutlets 是否必須被合成?
不,但這樣更方便。 編譯器強制執行的規則是 @properties 在實現中必須有相應的訪問器(合成的或不合成的)。
供參考:從 Xcode 4.4 和 LLVM Compiler 4.0 開始,不再需要 @synthesize 指令,因為默認情況下將為接口中定義的 @properties 提供它。
如果你輸入
@property (nonatomic, retain) IBOutlet UITableView *tableView;
你告訴編譯器:“聽着,會有一個 getter 和一個 setter。如果合適,使用它們。” 它會在加載筆尖時使用它們。
因此,您必須實現 getter 和 setter,否則編譯器會抱怨。
IBoutlet 偽類型只是一個標記,因此 InterfaceBuilder“知道”所提到的類文件具有 UITableView 實例的句柄/出口。
編譯 IBOutlet 時,預處理器正在刪除(InterfaceBuilder 解析(查看)源文件)。 它與 IBAction 類似:它被預處理器替換為 void。
也就是說,您可以使用對所述實例的引用以編程方式執行操作(例如添加/更改 UITableView 的值)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.