2012-05-21 7 views
4

는 :메모리 관리

UILabel *temp = [[UILabel alloc] init]; 
self.myLabel = temp; 
[temp release]; 

temp는 다음 시나리오에서 어떤 일이 일어날 것이라고입니다 사용하지 않습니까?

self.myLabel = [[UILabel alloc] init]; 
[myLabel release]; 

내가 인해 속성에 dealloc[myLabel release];를 추가 가정한다.

적절한 메모리 관리가 맞습니까? 두 번째 예에서 init 행 이후에 myLabel의 보유 수는 2입니까?

답변

5

두 번째 문제가 발생할 수 있지만 올바르지 않습니다. 첫 번째 줄은 setMyLabel:입니다. 그것은 ivar를 설정하는 일이 있습니다, 그렇지 않을 수도 있습니다. 그것은 모든 종류의 일을 할 수 있습니다 (사본을 만들 수도 있고 다른 곳에 정보를 저장할 수도 있습니다). 두 번째 줄은 ivar입니다. 세터가 당신이 추측하는 방식대로 구현된다면, 당신은 운이 좋을 것이며 작동 할 것입니다. 그러나 이것은 올바른 메모리 관리가 아닙니다.

첫 번째 예가 정확합니다. autorelease 풀을 사용하여 단순화 할 수도 있습니다. ARC로 코드를 옮기는 것이 더 좋으며,이 모든 문제를보다 빠르고 쉽게 해결할 수 있습니다.

+0

+1 ARC를 사용한 메모리 관리가 실제로 훨씬 쉽습니다. – dasblinkenlight

-1

속성에 할당하면 retain 속성에 할당되어있는 객체에서 자동으로 retain이 호출됩니다 (이전 객체의 release). 그래서 그래,

self.myLabel = [[UILabel alloc] init]; 

[myLabel retainCount] 후 속성을 할당하는 init 하나에서 둘, 하나를 반환합니다. 따라서 위의 줄에 autorelease을 추가하거나 함수가 종료되기 전에 release으로 호출해야합니다.

+0

절대 보유 횟수는 의미가 없습니다. – bbum

+0

@bbum 왜 그렇게 말합니까? – jmosesman

+2

참고 : http://whentouseretaincount.com – bbum