it-swarm-ko.tech

NSAutoreleasePool 자동 릴리스 풀은 어떻게 작동합니까?

내가 이해 한 것처럼 alloc, new 또는 copy로 만든 항목은 수동으로 해제해야합니다. 예를 들면 다음과 같습니다.

int main(void) {
    NSString *string;
    string = [[NSString alloc] init];
    /* use the string */
    [string release];
}

그러나 내 질문은 이것이 유효하지 않습니까? :

int main(void) {
    NSAutoreleasePool *pool;
    pool = [[NSAutoreleasePool alloc] init];
    NSString *string;
    string = [[[NSString alloc] init] autorelease];
    /* use the string */
    [pool drain];
}
94
James Sumners

예, 두 번째 코드 스 니핏은 완벽하게 유효합니다.

-autorelease가 오브젝트로 전송 될 때마다 가장 안쪽의 자동 릴리스 풀에 추가됩니다. 풀이 배수되면 풀의 모든 객체에 -release를 보내기 만하면됩니다.

자동 릴리스 풀은 단순히 "나중에"전송 릴리스를 연기 할 수있는 편의성입니다. 이 "나중"은 여러 곳에서 발생할 수 있지만 Cocoa GUI 앱에서 가장 일반적인 것은 현재 실행 루프 사이클의 끝입니다.

66
kperryua

NSAutoreleasePool : 드레인과 릴리스

drainrelease의 기능이 혼동을 일으키는 것으로 보이므로 여기서 명확하게 설명 할 가치가있을 수 있습니다 ( 문서 ...).

엄밀히 말하면, 큰 그림의 관점에서 drainrelease에 해당하는 not 입니다.

참조 횟수 환경에서 drainrelease와 동일한 작업을 수행하므로 두 가지 의미가 동일합니다. 강조하기 위해 이것은 drain 대신 release를 사용하는 경우 풀을 누출시키지 않음 을 의미합니다 .

가비지 수집 환경에서 release는 no-op입니다. 따라서 효과가 없습니다. 반면에 drain에는 "필요한 경우 수집"해야한다는 힌트가 수집기에 있습니다. 따라서 가비지 수집 환경에서 drain를 사용하면 시스템 균형 수집을 돕습니다.

37
mmalc

이미 지적했듯이 두 번째 코드 스 니펫이 정확합니다.

모든 환경에서 작동하는 오토 릴리즈 풀 (참조 횟수, GC, ARC 참조)을 사용하는보다 간결한 방법을 제안하고 싶습니다.

int main(void) {
  @autoreleasepool {
    NSString *string;
    string = [[[NSString alloc] init] autorelease];
    /* use the string */
  }
}

위의 예에서 @ autoreleasepool 블록에 유의하십시오. 이것은 여기 로 문서화되어 있습니다.

17
Neovibrant

아니, 넌 틀렸어. 설명서에는 GC가 아닌 경우 -drain이 -release와 동일하다는 것이 명시되어 있는데 NSAutoreleasePool은 not이 유출 될 것입니다.

7
kperryua

이 링크는 NSAutoReleasePool 사용시기와 방법에 대한 최상의 설명을 제공합니다. AutoReleasePool

1
Wayne Lo

풀 대신 객체를 릴리스하는 대신 자동 릴리스를 보내면 풀 자체가 비워 질 때까지 해당 객체의 수명이 연장됩니다 (객체가 나중에 유지되는 경우 더 길어질 수 있음). 객체를 동일한 풀에 여러 번 넣을 수 있으며,이 경우 풀에 넣을 때마다 릴리스 메시지가 나타납니다.

0
Hardik Mamtora

예, 코드가 완벽합니다. 가비지 수집을 사용하는 경우 문자열을 nil로 설정하면 충분합니다. 가비지 수집은 앱 성능에 좋지 않으므로 사용하지 않는 것이 좋습니다 .P

0
Antwan van Houdt

Apple에서 읽은 내용 : "자동 릴리스 풀 블록이 끝날 때 블록 내에서 자동 릴리스 메시지를받은 객체는 릴리스 메시지를 보냅니다. 개체는 블록 내에서 자동 릴리스 메시지를받을 때마다 릴리스 메시지를받습니다. "

https://developer.Apple.com/library/mac/documentation/cocoa/conceptual/MemoryMgmt/Articles/mmAutoreleasePools.html

0
Gagan_iOS