2010-03-24 4 views
2

인스트루먼트를 사용하여 UIImage로 메모리 누수가 계속 지적됩니다.
메모리를 올바르게 할당하고 해제한다고 생각합니다. 악기의 누출 된 개체는 NSConcreteData로 설명됩니다.UIImage를 메모리에 할당하고 릴리즈하는 올바른 방법은 무엇입니까?

UIImage를 할당하고 해제하는 올바른 방법은 다음과 같습니다.

UIImage* flagimg = [UIImage imageWithData: [NSData dataWithContentsOfURL:url2]];  
[flagimg release]; 
flagimg =nil; 

답변

8

[UIImage imageWithData:]은 자동 릴리스 된 객체를 반환하며 사용자가 다시 해제하면 안됩니다. 따라서이 코드는 메모리 누수가 아니라 반대쪽에 두 배의 여유 공간을 포함합니다 (최악의 경우).

인스 트루먼 트가 때때로 가양 성을 생성하고/또는 Foundation 자체에서 메모리 누수를보고합니다 (예 : 실수도 함 :-).

ALLOC에 가장 빠른 방법은/객체를 해제하는 것은 imageWithData 같은 :) 대신

NSData* data = [[NSData alloc] initWithContentsOfURL:url]];
UIImage* img = [[UIImage alloc] initWithData:data];
[data release];
// use your image
[img release];

이 할당하고 바로 개체를 해제 할 때까지 기다릴 것 같은 뭔가 (편의 초기화를 방지하는 것입니다 자동 해제 풀이 정리됩니다.

그러나 메모리 누수가 아직 해제하지 메모리가 일반적이지만, 그래서 오토 릴리즈 풀에서 할당 해제 될 객체가 아닌, 즉 손실되고 더 이상을 해제 할 수없는, 너무 유의하시기 바랍니다 메모리 누수를 고려했다. 당신이 프로그래머는 "초기화", "복사"또는에서 "유지"가, 당신이 그것을 해제 할 객체를 생성하는 경우

+0

"이중 릴리스"의 결과는 무엇입니까? – dubbeat

+0

일반적으로 프로그램을 중단시키는 EXC_BAD_ACCESS (일반적으로 segfault라고 함). 이미 할당이 해제 된 객체에 대한 참조가 있고 그 객체에 액세스하려는 경우에도 이러한 일이 발생합니다. – Alfonso

0

모두 imageWithDatadataWithContentsOfURL 반환 오토 릴리즈 객체, 그래서 당신은 그 코드에는 메모리 누수가 없어야한다.

flagimg이 자동 다시 반환되기 때문에 [flagimg release]; 호출이 필요하지 않습니다. 당신은 그 대상을 과도하게 공개하고 있습니다.

1

일반적으로 당신은

을 말할 수있다. 그렇지 않은 경우 자동 다시 렌더링 된 개체가 생성됩니다.

항상 그렇지는 않지만 대부분의 경우

관련 문제