2010-08-10 3 views
3

UIImage를 사용할 때 imagenamed : 끝내기 전에 UIImages를 유지하는 변수를 설정해야합니까? 때로는 UIImages가있는보기간에 전환 할 때마다 메모리가 계속 커지고 각 스위치가 앞뒤로 커집니다.UIImage 공개 imageNamed

답변

5

변수를 nil로 설정하지 않아도됩니다.

nil (self.property = nil;)으로 속성을 설정하면 @property (retain)으로 선언됩니다.

+imageNamed:은 "alloc", "copy", "new"또는 "retain"으로 시작하지 않으므로이를 해제 할 필요가 없습니다. 공간이 필요하지 않기 때문에 가능한 것들이 메모리에 남아있을 수 있습니다. 누출이나 메모리 사용량 만 보입니까?

+0

~ 340MB부터 시작합니다 (프로그램을 열지 않음). 보기를 앞뒤로 전환하면 스위치 당 약 9MB의 메모리가 떨어집니다. 거의 모든 경우에 5MB 정도를 복구하지만, 190MB로 줄이고 기다렸습니다. – Derek

3

UIImage 변수를 nil으로 설정하면 특히 유용하지 않습니다. 또한 메소드 이름이 반환 된 객체의 소유권을 가지고 있다는 것을 의미하지 않기 때문에 +imageNamed:에서 반환 된 이미지를 공개해서는 안됩니다.

코코아는 이미지 캐시를 유지 관리합니다. 이후에 imageNamed:를 호출하면 (즉, UIImage의 객체가 불변이므로) 이미로드되어있는 경우는 같은 UIImage 객체를 돌려 주어, 그렇지 않은 경우는 다시 캐쉬에로드합니다. 캐시에서 이미지의 수명은 Cocoa가 결정합니다. 메모리가 부족한 상황에서는 이미지 데이터가 삭제 될 수 있습니다. 실제 내부 이미지 데이터가 캐시에서 지워지더라도 소유 한 개체는 여전히 이미지를 참조 할 수 있습니다 (캐시에서 제거 된 경우 Cocoa에서 이미지 데이터를 다시로드합니다). 그것은 UIImage documentation에 걸쳐 설명되어 있습니다.

메모리 사용량이 지속적으로 증가하면 누수가 다른 곳에서 발생했을 가능성이 큽니다.

관련 문제