2011-03-29 6 views
0

다른 뷰의 NSMutableArray와 함께 UIView 하위 클래스를 사용하여 값을 막대로 표시합니다.
initWithFrame에서 초기화하십시오. Instruments는 NSMutableArray의 할당에 누수가 있다는 것을 UIView 서브 클래스의 일부 생성 및 제거 후에 알려줍니다.
왜 내가 여러 프레임을 피하기 위해 프레임을 만들 었는지. 하지만 도움이되지 않습니다initWithFrame의 메모리 누수

- (id) initWithFrame :(CGRect)frame 
{ 
self = [super initWithFrame:frame]; 
if (self.uiValueSubviews == nil){ 
    self.uiValueSubviews = [[NSMutableArray alloc]init]; 
} 
return self; 
} 

- (void)dealloc { 
[self.uiValueSubviews release]; 
[super dealloc]; 
} 

내가 dealloc에 ​​문제가 있습니까?
덕분에 당신의 도움을 위해

답변

5

두 문제는 내가 당신의 재산을 포함하는 메모리 관리를 참조하십시오.

  1. 속성은 항상 autorelease D 객체로 설정해야하거나 객체는 당신은 당신의 자신에 공개됩니다.
  2. 절대로 직접 부동산으로 석방을 보내지 마십시오. 가능한 경우 기본 변수를 해제하는 것이 좋습니다 (예 : [_uiValueSubviews release];)

코드를 다음과 같이 변경하십시오.

- (id) initWithFrame :(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self.uiValueSubviews == nil){ 
     //Set to autoreleased array 
     self.uiValueSubviews = [NSMutableArray array]; 
    } 
    return self; 
} 

- (void)dealloc { 
    //nil the value 
    self.uiValueSubviews = nil; 
    [super dealloc]; 
} 
+1

+1하지만 속성을 * retain * 또는 * copy *가 아닌 * assign * (이 경우 반드시 있어야 함)로 추가해야합니다. – Eiko

+0

사실 그는 그가보고 된 메모리 누출을 얻은 이후로 최소한 유지했다고 가정했습니다. 당신의 속성은'@property (retain) NSMutableArray * uiValueSubviews'와 비슷하게 보일 것입니다; – Joe

+0

고마워, 빌어 먹을 나는 내 재산에 대해 생각해 본적이 없다. – Seega

1

당신은 다음과 같이해야한다 : 당신 ALLOC, 당신의 retainCount가 1과 자기 때

- (id) initWithFrame :(CGRect)frame 
{ 
    if ((self = [super initWithFrame:frame])) 
    { 
    if (self.uiValueSubviews == nil){ 
     uiValueSubviews = [[NSMutableArray alloc]init]; 
    } 
    return self; 
} 

- (void)dealloc 
{ 
    self.uiValueSubviews = nil; 
    [super dealloc]; 
} 

당신 uiValueSubviews 그래서 아마 유지하는 속성입니다. +1.

1

다른 방법은, 오토 릴리즈 객체를 피할 것 :

// ... 
if (self.uiValueSubviews == nil) 
{ 
    NSMutableArray *uiValueSubviews_tmp = [[NSMutableArray alloc] init]; 
    // maybe do something with uiValueSubviews_tmp 
    self.uiValueSubviews = uiValueSubviews_tmp; 
    [uiValueSubviews_tmp release]; 
} 
// .... 

는 지금까지 내가 아는 한, 그 애플이 자신의 예에서 처리하는 방식.