2011-08-26 4 views
7

표준 Objective-C 수동 메모리 관리에서ARC에서 NSArray의 요소를 어떻게 릴리스합니까?

imageArray = [[NSArray alloc] initWithObjects:[UIImage imageNamed:@"1.png"], 
         [UIImage imageNamed:@"2.png"], 
         nil]; 

를 사용하여 초기화 된 NSArray를 해제하는 방법은

에서 제안되었습니다.

[imageArray release]; 
imageArray = nil; 

-release을 더 이상 사용할 수 없다고 가정하면 자동 참조 카운팅에서 ARC에서이 NSArray를 해제하는 방법은 무엇입니까?

+0

다른 내용으로 연결하고 "ARC를 사용하여 수행하는 방법"을 묻는 대신 실제 내용을 입력하십시오. – BoltClock

+2

ARC에서 imageArray = nil을 설정할 수 없습니까? 정적 분석기는 릴리스 여부를 결정합니다. – matthias

+0

가능한 [버튼 클릭시 깨끗한 이미지 배열] (http://stackoverflow.com/questions/3178039/clear-image-array-on-button-click) – Caleb

답변

12

imageArray가 객체에 대한 ivar (안전하지 않을 수도 있음) 인 경우 접근자를 사용하여 배열을 nil로 설정해야합니다. 접근은 배열을 방출 돌봐 및 회원의 모든 것 :

[self setImageArray:nil];

회원이 많은 배열을 청소하지만 다른 방법이 안전하게 할 수 있도록 그 바르에 준비가 유효한 배열을 유지해야하는 경우 그것에게 메시지를 보내, 다음을 사용할 수 있습니다

[self setImageArray:[[NSArray alloc] init]];

빈 배열로 기존의 배열을 교체 할.

+1

배열을 유지한다고 말하는 것은 약간 오해의 소지가 있습니다. 당신은 그것을 지키지 않고 새로운 빈 배열로 대체 할 것입니다. – Caleb

+0

참; 그에 따라 내 대답을 편집 할 것입니다. – matthias

+1

"imageArray가 객체의 ivar (아마 안전한 가정은 아님) 인 경우 배열을 nil로 설정하는 접근자를 사용해야하며 접근자는 배열과 그 구성원을 모두 해제 처리합니다"An ivar isn ' t 속성과 동일합니다. 모든 속성은 인스턴스 변수를 사용하지만 모든 인스턴스 변수가 속성을 사용하는 것은 아닙니다. 또한 ARC에서는 자동 릴리스를 수행 할 속성이 필요하지 않습니다. ivar을'nil'으로 설정하면 (즉 :'imageArray = nil') 컴파일러가 작업을 수행합니다. ;-) –

19

ARC를 사용하려면 retainrelease 메시지 만 제거하면됩니다. 그래서 당신은 다음과 같이 배열을 제거 :

imageArray = nil; 

이 작동하고 컴파일러가 자동으로 필요한 retainrelease 전화를 삽입 ARC 아래에 있기 때문에 누설하지 않습니다.

관련 문제