2013-03-07 53 views
0

使用addSubview時防止內存泄漏的正確方法是什麼?我收到來自Instruments的投訴,說明此代碼存在泄漏。我究竟做錯了什麼?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]; 
} 

感謝您的幫助。

回答

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.減去release,dealloc,給你1.這就是爲什麼你有泄漏。

+0

然後在我的addSubview調用中,我會使用:[self addSubview:self.ivarLabel]還是[self addSubview:ivarLabel]? – user542428 2013-03-07 22:16:04

+0

在這種情況下,並不重要,因爲您正在使用get方法(請記住,當您使用'self.something'時,實際上使用該屬性的setter或getter方法)。 – Peres 2013-03-08 13:27:59