使用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。为什么你有泄漏。

10-06 02:55