19

ARC 하에서 루프 용 @autoreleasepool을 만드는 것이 좋습니다.

NSData* bigData = ... 
while(some condition) { 
    NSData* smallData = [bigData subdataWithRange:...]; 
    //process smallData 
} 

은 ARC에서, 나는 여전히 while 조건 주위 @autoreleasepool을 포장한다 ...의 내가 오토 릴리즈있는 NSData 객체의 무리를 반환하는 루프가 있다고 가정 해 봅시다?

NSData* bigData = ... 
@autoreleasepool { 
    while(some condition) { 
     NSData* smallData = [bigData subdataWithRange:...]; 
     //process smallData 
    } 
} 

내가 부탁 해요 이유는 내가 initWith... 방법 대조적으로 dataWith... 메소드를 호출 내있는 NSData 객체에 대한 지붕을 통해서가는 악기의 생활 할당 횟수를 볼 수 있습니다. initWith...을 사용하면 실제 할당 횟수가 훨씬 적습니다.

가능한 경우 언제든지 initWith... 방법을 선호합니까?

답변

13

예 고정 된 루프에서 편리한 방법을 사용할 때는 자동 풀 풀을 사용해야합니다. 이전의 모든 메모리 관리 규칙은 여전히 ​​ARC에서 적용되지만 컴파일러는 단순히 RR을 주입하는 것입니다. 굉장한 Mike Ash의 위대한 포스트를 체크 아웃하십시오!

Link

+0

위대한 링크에 감사드립니다! –

+10

@ Chuck의 답변에 따르면 @autoreleasepool은 어떤 일을하기 위해서 루프 내부로 * 이동해야합니다. 관용구는 @autoreleasepool {while (x) {...}}이 아닌'while (x) @autoreleasepool {...}'입니다. – Quuxplusone

+0

이것은 간단하고 부정확합니다. ARC는 종종 autorelease pool의 사용을 +0 객체를 반환하는 메소드에 최적화합니다 (대부분 autorelease 사용을 사용합니다). –

7

에서 ARC, 난 여전히 동안 상태 주위 @autoreleasepool을 포장해야합니까?

예. Autorelease 풀은 여전히 ​​제 위치에 있으며 이전과 같이 성장하고 팝업합니다. 컴파일러는 TU 및 기본 명명 규칙에서 볼 수있는 메서드를 기반으로 ARC가 활성화 될 때 (Logan이 반향 됨) 필요한 유지 및 릴리스 작업을 추가하고 병합합니다.

ARC에서의 실행은 수동 참조 계산과 거의 동일합니다. 자동 복구 풀 스택이 여전히 존재합니다. 한 가지 차이점은 컴파일러가 참조 계산 작업을 작성한 방식 (잘못된 방식이 아닌)과 약간 다르게 정렬하고 불필요한 유지주기를 생략 할 수 있다는 것입니다.

언제든지 가능한 경우 initWith ... 메소드를 사용하는 것이 더 좋습니까?

자동 릴리스 된 카운터 파트와 비교하여 힙 증가를 최소화하는 WRT : 예. 항상 그랬습니다. 메모리가 상당히 제한적인 iOS 기기에서 특히 중요합니다.

개체가 할당을 피할 수있는 경우는 예외입니다. 예 :이 경우

NSString * copy = [NSString stringWithString:arg]; 

copy[[arg retain] autorelease] 수있다. 이 경우 copy은 여전히 ​​자동으로 리 릴리스되지만, 그러한 최적화의 존재 여부를 테스트하기 위해 일반적으로 많은 노력을 기울이지 않아야합니다. 참고 : 여기 copy = [arg copy] ... [arg release]을 사용하는 것이 더 좋습니다.

또 다른 보너스는 개체가 자동으로 재생되지 않을 때 더 자주 참조 횟수 불균형이 발생하며 종종 자동 복구 풀이 마비되는 경우가 아니라 호출 사이트에 더 가깝게 걸리는 것입니다.

대규모 autorelease 풀을 사용한 성능은 실제로 대부분의 사람들이 생각하는 것보다 훨씬 나쁩니다. 그들에 의존하는 것을 피할 수 있다면 (예 : alloc + init ...)+ release) 프로그램을 눈에 띄게 빠르게 만들 수 있습니다. 자동 풀 풀을 명시 적으로 생성하는 것은 저렴하며이 문제를 최소화하는 데 도움이 될 수 있습니다. 할당이 크거나 많은 경우 가능한 경우 autorelease을 사용하지 말고 명시 적 자동 릴리스 풀에서이 섹션을 래핑하십시오.

13

당신의 문제는 자동 풀이가 안에 있고 그 루프가이라고 생각합니다. autorelease 블록 안의 루프를 사용하면 루프가 완료 될 때까지 누적 된 오브젝트가 해제되지 않습니다.

+0

루프 안에'@ autoreleasepool'을 넣을 생각이 없습니다 ... 팁 주셔서 감사합니다. –