2011-03-22 9 views
0

다음과 같은 코드가 있습니다.iPhone - 메모리 누출 문제 - 메모리 누수가 발생했습니다.

- (void)viewDidLoad 
{ 
NSArray* myarr = [self createArray]; 
for (NSString* str in myarr) 
{ 
    NSLog(@"%@",str); 
} 
[myarr release]; 
} 

-(NSArray*)createArray 
{ 
NSArray* arr1 = [[NSArray alloc] initWithObjects:@"APPLE",@"MAC",@"IPHONE",nil]; 
return arr1; 
} 

"Build & Analyze"에는 두 개의 누설이 표시됩니다. 하나는 [myarr release]에 있는데,이 시점에서 소유하고있는 객체의 참조 횟수가 잘못 감소했습니다. 및 기타를 반환 arr1, 말합니다, 잠재적 인 누설의 대상물에 할당 된 라인 152 arr1에 저장됩니다.

위의 코드에서 "createArray"메서드가 포인터를 반환하고 나도이를 릴리스합니다. 코딩의 옳고 그른 방법입니까?

답변

1

위의 코드에서 "createArray"메서드가 포인터를 반환하고 나도 해제합니다. 코딩의 옳고 그른 방법입니까?

당신이 어떻게 보느냐에 따라 다릅니다.

1) 심판 계수는 경우에 따라 이름을 기준으로 확인

2) 정적 분석기 플래그 objc 방법을 보인다. 따라서 createArray의 이름을 newArray 또는 new*으로 변경하면 문제가 사라질 수 있습니다. 그래서 그것은 (애플에 의해 사용되는) 대회가 뒤따를 것으로 기대합니다.

따라서 얕은 메시지이지만 프로그램을 실제로 분석하지는 않지만 관습에 따라 결과/결과를 기반으로합니다. 사람이 읽을 수있는 실제 문제는 아닙니다.

0

는 코드이

- (void)viewDidLoad 
{ 
NSArray* myarr = [[NSArray alloc] initWithArray:[self createArray]]; 
for (NSString* str in myarr) 
{ 
    NSLog(@"%@",str); 
} 
[myarr release]; 
} 

-(NSArray*)createArray 
{ 
NSArray* arr1 = [[NSArray alloc] initWithObjects:@"APPLE",@"MAC",@"IPHONE",nil]; 
return [arr1 auotrelease]; 
} 

문제는

  1. 당신은 그래서 당신이 개체의 소유권을하지 않는 alloc 또는 new를 사용하여 myarr을 할당하지 않는 것이보십시오. 따라서 릴리스의 문제.

  2. arr1을 할당하여 개체의 소유권을 가져오고 arr1을 반환합니다. 그러므로 당신은 그것을 풀어주지 않습니다. 그것이 누출의 원인입니다.

+0

코드에 누수가 없습니다. 정적 분석기는 이것을 실현할만큼 똑똑하지 않습니다. 불필요하게 제공하는 코드는 두 개의 배열을 생성합니다. – imaginaryboy

1

viewDidLoad 메서드에서 배열을 사용하는 경우 배열을 전혀 할당 할 필요가 없습니다. 제안 된 7KV7로 반환 된 자동 레이아웃 배열을 사용할 수 있습니다. 객체를 alloc '하지 않고도 - (void) createArray에 autoreleased 배열을 반환 할 수 있습니다. 다음은 그 예입니다.

- (void)viewDidLoad 
{ 
NSArray* myarr = [self createArray]; 
for (NSString* str in myarr) 
{ 
    NSLog(@"%@",str); 
} 
} 

-(NSArray*)createArray 
{ 
return [NSArray arrayWithObjects:@"APPLE",@"MAC",@"IPHONE",nil]; 

} 

개체를 할당 할 필요가 없다면 더 작고 깨끗한 코드 인 IMO로 만들 수 있습니다.

+0

나는 이것을 안다. 하지만 기본적으로 컴파일러에서 코드에 누수 오류가 발생하는 이유를 알고 싶습니다. justin의 답장을 참조하십시오. 답장을 보내 주셔서 감사합니다. – Satyam

관련 문제