在创建自定义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声明。 此外,我正在使用自动引用计数创建应用程序,因此垃圾收集需求也不存在。在使用实例变量时会有什么不同?特性
答案 0 :(得分: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"];
我希望这有助于澄清一些事情。
答案 1 :(得分:1)
如果您不创建实例变量(iVar),那么如果您使用@synthesize指令(见下文),它们将自动为您创建,因此它们确实不是必需的。如果您正在使用@dynamic或编写自己的方法并希望直接访问iVar,那么您需要自己声明。
在属性实施指令部分的Declared Properties文档中,它指出:
@synthesize您可以使用@synthesize指令告诉编译器 它应该合成一个setter和/或getter方法 属性,如果你不在@implementation块中提供它们。 @synthesize指令还合成了一个适当的实例 变量,如果没有另外声明。
请注意,此行为适用于“现代”运行时(2.0及更高版本)。在此之前,需要声明iVar或@synthesize会产生错误。