2009-08-18 1 views
1
나는 여전히 내 누수 문제에 일하고 있어요

와 나는 각 arrayTmp addObject 라인 여기 사냥 아래로 누출


NSMutableArray *arrayTmp= [[NSMutableArray alloc] init]; 


[arrayTmp addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"1", @"value", @"Value 1", @"name", nil]]; 
[arrayTmp addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"2", @"value", @"Value 2", @"name", nil]]; 
[arrayTmp addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"3", @"value", @"Value 3", @"name", nil]]; 
[arrayTmp addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"4", @"value", @"Value 4", @"name", nil]]; 
//add arrayTmp to an object to use later 
[arrayTmp release]; 
arrayTmp=nil; 

arrayTmp= [[NSMutableArray alloc] init]; 

[arrayTmp addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"1", @"value", @"other value 1", @"name", nil]]; 
[arrayTmp addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"2", @"value", @"other value 2", @"name", nil]]; 
//add arrayTmp to an object to use later 
[arrayTmp release]; 
arrayTmp=nil; 
... 
내 필터의 코드에 누수가이 일을 해결하는 방법을 모른다 당신이 객체로 arrayTmp를 밀어하고 -retain'ing하는 것을 의미한다 클래스

@implementation Filter 

@synthesize label; 
@synthesize valueIndex; 
@synthesize listValue; 
@synthesize webServiceFieldName; 

-(id) initWithLabel:(NSString *)plabel AndValue:(int)pvalueIndex AndListValue:(NSMutableArray *)plistValue AndWebServiceFieldName:(NSString *)pwebServiceFieldName { 

self = [super init]; 

if (self != nil) { 
    self.label = plabel; 
    self.valueIndex = pvalueIndex; 
    self.listValue = plistValue; 
    self.webServiceFieldName = pwebServiceFieldName; 

} 
return self; 
} 

@end 
+0

누출이 보이지 않습니다. 당신이 사용하고있는 것은 무엇입니까? – Chuck

+0

xCode 누출 성능 도구를 사용합니다 이 코드를 두 번째로 호출하면 누수가 나타납니다 – Mathieu

+0

ArrayTmp를 나중에 사용하기 위해 개체에 어떻게 추가합니까? 거기에 실제 코드가 있습니까? 그렇다면 무엇입니까? 그게 누수 일 수도 ...또한 nil로 설정할 필요도 없습니다. 그것은 무의미합니다. –

답변

-1

좋아, 내 코드


-(id)initSearchFilters{ 
    self = [super init]; 


    if (self) { 

    //init the search filters array 
    self.searchFilters = [[NSMutableArray alloc] init]; 
    SearchCriteria *searchCriteriaTmp; 
    Filter *filterTmp1; 
    Filter *filterTmp2; 
    NSMutableArray *arrayTmp= [[NSMutableArray alloc] init]; 

    //Price Range 
    arrayTmp = [[NSMutableArray alloc] init]; 

    [arrayTmp addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"any", @"value", @"any", @"name", nil]]; 
    [arrayTmp addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"100", @"value", @"$100", @"name", nil]]; 
    [arrayTmp addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"200", @"value", @"$200", @"name", nil]]; 
    [arrayTmp addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"300", @"value", @"$300", @"name", nil]]; 
    [arrayTmp addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"400", @"value", @"$400", @"name", nil]]; 
    [arrayTmp addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"500", @"value", @"$500", @"name", nil]]; 


    filterTmp1 = [[Filter alloc] initWithLabel:@"Minimum Price" AndValue:0 AndListValue:arrayTmp AndWebServiceFieldName:@"price_min"]; 
    filterTmp2 = [[Filter alloc] initWithLabel:@"Maximum Price" AndValue:0 AndListValue:arrayTmp AndWebServiceFieldName:@"price_max"]; 
    searchCriteriaTmp = [[SearchCriteria alloc] initWithFilter1:filterTmp1 AndFilter2:filterTmp2 AndLabelSearchCriteria:@"Price Range" AndEnabled:NO]; 
    [self.searchFilters addObject:searchCriteriaTmp]; 
    [arrayTmp release]; 
    arrayTmp=nil; 
    [filterTmp1 release]; 
    filterTmp1=nil; 
    [filterTmp2 release]; 
    filterTmp2=nil; 
    [searchCriteriaTmp release]; 
    searchCriteriaTmp=nil; 

    //Item 
    arrayTmp = [[NSMutableArray alloc] init]; 

    [arrayTmp addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"1", @"value", @"item 1", @"name", nil]]; 
    [arrayTmp addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"2", @"value", @"item 2", @"name", nil]]; 
    [arrayTmp addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"3", @"value", @"item 3", @"name", nil]]; 
    [arrayTmp addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"4", @"value", @"item 4", @"name", nil]]; 

    filterTmp1 = [[Filter alloc] initWithLabel:@"Item" AndValue:0 AndListValue:arrayTmp AndWebServiceFieldName:@"item"]; 
    searchCriteriaTmp = [[SearchCriteria alloc] initWithFilter1:filterTmp1 AndFilter2:nil AndLabelSearchCriteria:@"Item" AndEnabled:NO]; 
    [self.searchFilters addObject:searchCriteriaTmp]; 
    [arrayTmp release]; 
    arrayTmp=nil; 
    [filterTmp1 release]; 
    filterTmp1=nil; 
    [searchCriteriaTmp release]; 
    searchCriteriaTmp=nil; 
    } 
    return self; 
} 
그리고 내 검색 기준 클래스

의 샘플입니다
-(id)initWithFilter1:(Filter *)pFilter1 AndFilter2:(Filter *)pFilter2 AndLabelSearchCriteria:(NSString *)pLabelSearchCriteria AndEnabled:(BOOL)pEnabled{ 

self = [super init]; 

if (self != nil) { 
    self.filter1 = pFilter1; 
    self.filter2 = pFilter2; 
    self.labelSearchCriteria = pLabelSearchCriteria; 
    self.enabled =pEnabled; 
} 
return self; 
} 

- (void)dealloc 
{ 
[filter1 release]; 
[filter2 release]; 
[labelSearchCriteria release]; 
[super dealloc]; 
} 
+0

initSearchFilters를 여러 번 호출하므로 self.searchFilters = [[NSMutableArray alloc] init]; 하지만 한 번만 호출되도록이 줄을 배치 할 수 있습니까? – Mathieu

+0

좋아, initSearchFilters를 여러 번 호출했기 때문에 해결되었습니다. – Mathieu

2
//add arrayTmp to an object to use later 

. 잘린 코드는 괜찮지 만 그 방법 내에서 누수가있을 것입니다.

ArrayTmp를 저장하는 코드와이 코드를 해제하는 메소드 (btw는 실제로는 -initWithLabel : value : listValue : webServiceFieldName : Obj-C의 명명 규칙을 따라야 함)를 게시하십시오.

인스트루먼트에서 Object Alloc 도구를 사용하여 배열 인스턴스를 볼 수 있어야합니다. 어느 하나를 클릭하면 해당 주소에 대한 할당/보유/해제/할당 취소 이벤트 목록을 제공해야합니다. 특정 이벤트에 대한 스택 추적은 창 오른쪽의 "추가 정보"창을 확장하여 볼 수 있습니다 (하단의 작은 버튼을 통해). 아래의 코드에서

, 당신의 이니셜이 같은 tmpArray 전달을 포함하여 인스턴스 변수를 설정합니다

self.label = plabel; 
    self.valueIndex = pvalueIndex; 
    self.listValue = plistValue; 
    self.webServiceFieldName = pwebServiceFieldName; 

그러나, 나는 -dealloc 방법을 볼 수 없습니다. 가되지 않습니다 - 당신은이 객체의 dealloc 때 당신이 당신의 합성 멤버 변수를 해제 할 필요가

- (void) dealloc 
{ 
    [label release]; 
    [listValue release]; 
    [webServiceFileName release]; 
    [super dealloc]; 
} 
1

: 당신의 특성을 가정

중 하나 retain 또는 copy으로 선언, 당신의 dealloc는 같아야합니다 자동으로 수행됩니다. 예를 들면 :

나는이 변경을하지만 난 여전히 여기에이 라인 에 누수 다스가
- (void)dealloc 
{ 
    [label release]; 
    [listValue release]; 
    [webServiceFieldName release]; 

    [super dealloc]; 
} 
+0

당신은 [super dealloc]을 잊었습니다; 결국. – bbum

+0

예; 결정된. 감사! – fbrereto

0

위 코드에서 SearchCriteria을 할당하고 initSearchFilters을 호출하는 줄은 다음과 같습니다. 결과의 retainCount을 1로 설정하십시오. addObject을 통해 self.searchFilters에 해당 객체를 추가하면 retainCount가 2로 증가합니다. 그 시점에서 [searchCriteriaTmp release]을 호출하여 retainCount를 다시 1로 설정해야합니다. self.searchFilters이 파괴되면 retainCount 그러면 0이되고 객체는 할당이 해제됩니다. release에 대한 추가 호출이 없으면 retainCount은 항상 1이 될 것이고 개체는 절대로 할당을 해제하지 않아 누수가 발생합니다.