2013-03-07 4 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)]; 

첫 번째 조각은 ARC에서 작동합니다.

왜 그렇습니까?

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

당신은 alloc 당신이 ([UILabel alloc])을 수행 플러스가 if 내부에서 수행 유지하는이 수를 유지 만드는 것을 볼 수 있습니다

는 세터는 내부적으로 (self.ivarLabel = ...)이 같은 논리를해야합니다 2를 입력하십시오. dealloc에있는 release을 뺀 값은 1입니다. 따라서 누출이 발생합니다.

+0

그러면 addSubview를 호출 할 때 [self addSubview : self.ivarLabel] 또는 [self addSubview : ivarLabel]을 사용하겠습니까? – user542428

+0

이 경우 get 메소드를 사용하기 때문에 중요하지 않습니다 (실제로 self.something을 사용할 때 setter 또는 getter 메소드를 사용하는 것을 기억하십시오). – Peres