addSubview的内存泄漏故障排除

时间:2013-03-07 21:53:05

标签: ios memory-leaks addsubview

使用addSubview时,防止内存泄漏的正确方法是什么?我收到了仪器的投诉,认为此代码存在泄漏。我做错了什么?

示例代码:

my.h

@interface MyCustomControl : UIControl {
    UILabel *ivarLabel;
}

@property (nonatomic, retain) UILabel       *ivarLabel;

my.m

@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];
}

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

而不是:

  self.ivarLabel = [[UILabel alloc] initWithFrame:CGRectMake( 0, 0, 10, 10)];

这样做:

  ivarLabel = [[UILabel alloc] initWithFrame:CGRectMake( 0, 0, 10, 10)];

第一个片段可以在ARC中使用。

但为什么?

内部的setter(self.ivarLabel = ...)将具有与此相同的逻辑:

-(void)setIvarLabel:(UILabel *)newLabel {
    if (ivarLabel != value) {
        [ivarLabel release];
        ivarLabel = [newLabel retain];
    }
}

您可以看到alloc你做的[UILabel alloc]加上if内的保留,会产生2的保留计数。减去releasedealloc,给你1.这就是你泄密的原因。