iOS 5.1: IBOutlet 实例变量和 @property 声明

4

在创建自定义的iOS表格视图单元时,我创建了一个新的.xib文件,在界面构建器中拖放了一些UI元素,我的.h文件如下所示...

#import <UIKit/UIKit.h>

@interface MasterTableViewCell : UITableViewCell
{
    IBOutlet UILabel *cellLabel;
    IBOutlet UIImage *cellImage;
}

@property (nonatomic, retain) IBOutlet UILabel *cellLabel;
@property (nonatomic, retain) IBOutlet UIImage *cellImage;

@end

在一些博客中,我看到实例变量丢失了。何时需要声明实例变量?对于特定的UI对象,实例变量和@property声明都不需要吗? 另外,我正在使用自动引用计数来创建应用程序,因此也不需要垃圾收集。这对实例变量和属性的使用有什么区别?


1
如果您正在使用ARC,则@property声明应该使用strong或weak而不是retain。 - lnafziger
2个回答

3
在iOS中没有垃圾回收机制。iOS使用引用计数来跟踪对象的所有权。使用ARC并不能消除引用计数,但编译器会负责释放和保留对象。当使用ARC时,您不允许向对象发送retain、release或autorelease消息,也不允许在dealloc方法中调用[super dealloc]。在上面的代码中,由于您正在使用ARC,应该用“strong”属性替换“retain”属性。
当您使用@property以及相应的@synthesize在您的实现中时,您不需要创建一个后备实例变量——编译器会为您完成这项工作。@property连同@synthesize一起创建了您的访问器方法(getter和setter),还使您能够使用点符号来引用对象的属性。如果您选择,仍然可以编写自己的访问器方法。
上述代码可以被以下代码替换:
#import <UIKit/UIKit.h>

@interface MasterTableViewCell : UITableViewCell

@property (nonatomic, strong) IBOutlet UILabel *cellLabel;
@property (nonatomic, strong) IBOutlet UIImage *cellImage;

@end

在您的实现文件中,您会有以下内容:
#import "MasterTableViewCell.h"

@implementation MasterTableViewCell

@synthesize cellLabel;
@synthesize cellImage;

或者

@synthesize cellLabel, cellImage;

... remainder of your code

在您的代码中,为确保使用访问器方法,请使用“self”来引用您的属性:

self.cellLabel.text = @"some text";

或者

[[self cellLabel] setText:@"some text"];

我希望这能稍微澄清一些事情。

retainstrong有什么区别? - BlackMamba

1
如果您没有创建实例变量(iVar),则如果您使用了 @synthesize 指令(见下文)它们将自动为您创建,因此它们并不是必需的。 如果您正在使用 @dynamic 或编写自己的方法并想要直接访问 iVar,则需要自己声明它。
Declared Properties的文档中,在Property Implementation Directives部分下,它说明:
@synthesize 你可以使用 @synthesize 指令告诉编译器,如果您没有在 @implementation 块内提供 setter 或 getter 方法,则它应合成一个属性的setter和/或getter方法。如果没有另行声明,@synthesize 指令也会合成一个适当的实例变量。
请注意,这种行为适用于“现代”运行时(2.0及更高版本)。 在此之前,iVar 必须被声明,否则 @synthesize 将生成错误。

1
这是旧代码,因此请保留,现在应使用强制 - WrightsCS
有趣的是,他说他正在使用ARC……我想这里可能有几个问题。 - lnafziger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接