개체는 -release
또는 -autorelease
메시지를 보내어 해제 할 수 있습니다.
-release
으로 참조 카운트가 즉시 감소되어 할당 해제로 이어질 수 있습니다.
-autorelease
으로 감소는 개체가 생성 된 범위를 벗어나지 않도록 유지됩니다. 예를 들어 도우미 메서드 -createFoo
은 자동 렌더링 된 개체를 반환 할 수 있으므로 호출자는 메서드에서 반환 될 때 즉각 해제되지 않고 반환 할 개체를 사용할 수 있으며 누가 공개해야 하는지를 염려 할 필요가 없습니다.
ARC를 사용하면 컴파일러에서 이러한 모든 세부 정보를 처리합니다. autorelease
을 사용하면 개체가 조금 오래 살아있을 수도 있다는 것을 알아야합니다.
- (void)foobar
{
for (/* a long time */) {
NSMutableString *s = [NSMutableString string];
// ...
}
}
는 NSMutableString
에 +string
방법은 오토 릴리즈 객체를 반환합니다
이 '유지 살아'문제는 다음과 같은 루프에 대한 의미를 가지고있다. 이것은 이 아니며은 루프 반복 또는 메소드의 끝에서 자동으로 할당이 해제되지 않습니다. (ARC는 호출 스택을 조사하여 영리한 최적화를 수행 할 수 있지만이를 무시합니다). 즉, 루프 본문 내에있을 때 무한대의 메모리가 증가하게됩니다.
NSMutableString *s = [[NSMutableString alloc] init];
다음 ARC는 루프 본문의 끝에
release
전화를 삽입합니다 및 문자열을 즉시 해제 할 것입니다 : 우리는 다음과 같은 사용했다면 것을
는
참고. 루프의 각 반복 한 후, 오토 릴리즈 풀은 파괴되고, 모든 객체는 오토 릴리즈 된 것을, 지금
- (void)foobar
{
for (/* a long time */) {
@autoreleasepool {
NSMutableString *s = [NSMutableString string];
// ...
}
}
}
: 이
이 첫 번째 예제의 무제한의 메모리 증가를 해결하려면
, 당신은 명시 적 오토 릴리즈 풀을 정의 수영장 안쪽 (우리 끈 포함)은 즉시 석방 될 것입니다.
그래서 모두 호출하는 메소드의 종류와 자동 릴리즈 된 객체를 반환하는지 여부에 따라 다릅니다.
"루프가 반복 될 때마다 자동 해제 풀이 삭제되고 풀 내부에서 자동으로 풀린 개체 (문자열 포함)는 즉시 해제됩니다." 그렇다면 내부적으로 자동 판매가 안되면 어떨까요? 그들의 수명이 블록을 벗어날 수 없기 때문에 어쨌든 autorelease 블록의 끝에서 해제되지 않을까요? 그럼 내 질문은 남아 : 왜 우리는 블록의 끝에 개체가 공개되는 방식 중 하나를 autorelease 전화가 필요합니까? – Teo
자동 복구 풀은 자동 복구 된 개체 만 릴리스합니다. autorelease가없는 객체의 경우, 컴파일러는 적절한 위치에 명시 적 릴리스 호출을 삽입하므로 자동 릴리스 풀이 끝나기 전에 릴리스됩니다. –
만약 당신이 이것을 오해하고있는 경우에 대비하여, 내 게시물의 첫 번째 코드 블록에는 자동 풀이 없습니다. 메서드 또는 루프 내부에서 생성 된 자동 렌더링 된 객체는 메서드가 반환 될 때 해제되지 않습니다. 그들은 나중에 풀릴 것이다. 대부분의 UI 코드에는 런 루프의 반복마다 생성되는 상위 자동 릴리스 풀이 있습니다. 그러나 꽉 짜여진 루프가 있다면 너무 많은 객체를 만들지 않도록 자신 만의 루프를 만들어야합니다. –