如果我有一个我声明为属性的出口变量
@interface MyClass:UIViewController
{
IBOutlet UILabel *label;
}
@property (nonatomic,retain) IBOutlet UILabel *label;
这样做有什么区别
[label release];
和这个
[self.label release];
答案 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];
为什么要发布界面元素?