繁体   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