使用self访问类数据成员与不使用它之间的区别

时间:2011-11-06 12:40:32

标签: iphone objective-c cocoa properties

如果我有一个我声明为属性的出口变量

@interface MyClass:UIViewController
{
IBOutlet UILabel *label;
}
@property (nonatomic,retain) IBOutlet UILabel *label;

这样做有什么区别

[label release];

和这个

[self.label release];

2 个答案:

答案 0 :(得分:1)

是的,有一点不同,当你使用一个属性时,你隐含地使用了一个访问器,也就是说:

- (UILabel*)label;

因此可以在getter中实现一些额外的行为,例如健全性检查等。

在这里,您将属性声明为保留:

@property (nonatomic,retain) IBOutlet UILabel *label;

因此,setter将自动保留要设置的值,并释放旧值。

使用:

[self.label release];

当您释放由访问者保留的对象时,您正在做一些危险的事情。所以,当你做类似的事情时:

self.label = nil;

它调用方法- (void) setLabel:(UILabel*)label,它将释放实际对象!因此,对象将被释放两次,从而导致释放对象访问权限!

如果您声明属性,请尝试仅通过此属性使用您的成员!

您还可以使用一些隐式成员声明,​​例如:

@interface MyClass

@property (nonatomic, retain) UILabel* label;

@end

@synthesize label = _label;

将隐式声明成员UILabel* _label:)

答案 1 :(得分:0)

是。在第二种情况下,您正在使用辅助方法。您应该使用第一个或self.label = nil; [self.label release];

为什么要发布界面元素?