使用addSubview时防止内存泄漏的正确方法是什么?我收到了Instruments的投诉,指出此代码有泄漏。我究竟做错了什么?
示例代码:
我的
@interface MyCustomControl : UIControl {
UILabel *ivarLabel;
}
@property (nonatomic, retain) UILabel *ivarLabel;
我的
@synthesize ivarLabel;
- (id)initWithFrame:(CGRect)frame {
if ((self = [super initWithFrame:frame])) {
self.ivarLabel = [[UILabel alloc] initWithFrame:CGRectMake( 0, 0, 10, 10)];
[self addSubview:self.ivarLabel];
}
return self;
}
- (void)dealloc {
[ivarLabel release];
[super dealloc];
}
谢谢你的帮助。
最佳答案
代替这个:
self.ivarLabel = [[UILabel alloc] initWithFrame:CGRectMake( 0, 0, 10, 10)];
做这个:
ivarLabel = [[UILabel alloc] initWithFrame:CGRectMake( 0, 0, 10, 10)];
第一个片段将在ARC中运行。
但为什么?
内部设置器(
self.ivarLabel = ...
)的逻辑与此相同:-(void)setIvarLabel:(UILabel *)newLabel {
if (ivarLabel != value) {
[ivarLabel release];
ivarLabel = [newLabel retain];
}
}
您会看到您执行的
alloc
([UILabel alloc]
)加上在if
内部完成的保留,将创建保留计数2。减去release
上的dealloc
,得到1。为什么你有泄漏。