2013-03-07 2 views
0

Каков правильный способ предотвратить утечку памяти при использовании 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]; 
} 

Спасибо за любую помощь.

ответ

2

Вместо этого:

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

ли это:

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

Первый фрагмент кода будет работать в АРК.

Но почему?

Установщик внутренне (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

+0

В этом случае не имеет значения, потому что вы используете метод get (помните, когда вы используете 'self.something', вы фактически используете методы setter или getter этого свойства). – Peres