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 声明。此外,我正在使用自动引用计数创建应用程序,因此也不存在垃圾收集需求。这对实例变量和属性的使用有什么影响?

4

2 回答 2

3

iOS 中没有垃圾收集。iOS 使用引用计数来跟踪对象的所有权。使用 ARC 不会取消引用计数,但编译器会负责释放和保留对象。使用 ARC 时,您不能向对象发送保留、释放或自动释放消息,也不能在 dealloc 方法中调用 [super dealloc]。在上面的代码中,由于您使用的是 ARC,因此“retain”属性应替换为“strong”属性。

当您在实现中使用 @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"];

我希望这有助于澄清一些事情。

于 2012-04-23T03:32:10.837 回答
1

如果您不创建实例变量(iVar),那么如果您使用 @synthesize 指令(见下文),它们将自动为您创建,因此它们确实不是必需的。如果您使用@dynamic 或编写自己的方法并想直接访问 iVar,那么您需要自己声明它。

在Property Implementation Directives部分下的Declared Properties文档中,它指出:

@synthesize 你使用@synthesize 指令告诉编译器如果你没有在@implementation 块中提供它们,它应该为一个属性合成setter 和/或getter 方法。如果没有另外声明,@synthesize 指令还会合成适当的实例变量。

请注意,此行为适用于“现代”运行时(2.0 和更高版本)。在此之前,需要声明 iVar,否则 @synthesize 会产生错误。

于 2012-04-23T03:11:40.213 回答