簡體   English   中英

@synthesize IBOutlet 屬性

[英]@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 的捷徑。

但我有一個問題:

  1. 在實現 tableView 的代碼中從未顯式調用,但 dealloc 釋放它;
  2. 如果它永遠不會被明確調用,為什么@synthesize?

IBOutlets 是否必須被合成?

Memory 管理 Nib 對象

當加載 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.

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