2010-03-18 2 views
2

일을 공개하는 것이 올바른지에 대한 많은 연구를 해봤지만 혼란 스럽습니다. 나는 때로 누수 프로그램이 꺼져 있다고 생각한다. 어쨌든 ...출시해야합니까?

배경이있는 UIImageView 내가 배경을 해제해야합니까

background.image = [UIImage imageNamed:@"greenbackground.png"]; 

입니까? 나는 그것을 할당하지 않았고 재산으로 설정되지 않았으므로 나는 아니오라고 생각하고 있습니다.

답변

2

사실, 해제해야합니다.

UIKit은 IBOutlets를 컨트롤러에 할당하기 위해 키 값 코딩을 사용합니다. 기본적으로 이로 인해 컨트롤러가 보유 수를 1만큼 증가시킵니다. KeyValueCoding의 문서에서 : 당신이 명시 적으로 assign와 @property를 설정하지 않는 한

If you have not defined a setter, then UIKit will directly set the value of the instance variable and then, for anything other than an NSNumber or NSValue date type, UIKit will retain the value after autoreleasing the instance variable’s old value.

, 당신은 객체를 해제해야합니다.

+0

대단히 고마워요. 코드 줄을 여러 번 사용하면 어떻게 되나요? if (firstbuttonclicked) { background.image = [UIImage imageNamed : @ "greenbackground.png"]; } else if (secondbuttonclicked) { background.image = [UIImage imageNamed : @ "redbackground.png"]; } – NextRev

+0

아니요 한 번만 놓아주십시오. 뷰를 생성 할 때 보유 수는 증가하지만 이미지를 할당 할 때는 증가하지 않습니다. – MarkPowell

+0

Ok 고마워요 – NextRev

0

아니요. 이 팩토리 메서드는 자동 렌더링 된 UIImage를 반환합니다. 엄밀히 말하자면 객관적인 C에서 도움이되는 좋은 규칙은 메서드 이름에 alloc, copy 또는 new가있을 때마다 ... 반환 된 객체를 해제하는 것입니다. 다른 모든 것은 자동 렌더링 된 객체 여야합니다. 또한 autoreleased 객체를 반환하지 않는 api의 클래스 수준 메서드 (+)는 생각할 수 없습니다.

EDIT 질문을 너무 빨리 읽었습니다 ... 이것에 대한 정확한 내용입니다. 이러한 종류의 것들에 대해 의심이가는 경우에는 항상 간단한 테스트를 수행하고 보유 수를 기록 할 수 있습니다.

+0

그는 "배경"에 대해 'UIImageView'를 공개 할 것인지 묻습니다. – MarkPowell

+0

고개를 숙여 주셔서 감사합니다. Mark –

0

마크가 오른쪽으로 펜촉에서 인스턴스화 된 경우 UIImageView를 릴리스해야하며, background이 IBOutlet이고 background에 해당 "할당"속성이없는 경우 Mark 's 권한이 있습니다.

올바르게 관리하더라도 UIImageView를 릴리스 한 후에 ObjectAlloc에서 사용중인 추가 메모리가 여전히 표시 될 수 있습니다. 나중에 -[UIImage imageNamed:]을 호출하면로드 할 이미지가 -[UIImage imageNamed:]에 저장되기 때문입니다. 반환 된 UIImage가 할당 해제 된 경우에도 이미지가 반드시 캐시되지 않습니다.

+0

다시 그는 "UIImageView"인 "배경"에 대해 질문하고 있습니다. – MarkPowell

+0

감사합니다. 이제 알았어. 편집 됨. – Tom

관련 문제