Programing

Swift 프로그램에서 autoreleasepool을 사용해야합니까?

lottogame 2020. 9. 13. 11:38
반응형

Swift 프로그램에서 autoreleasepool을 사용해야합니까?


의 17 페이지에 이 WWDC14 발표 , 그것은 말한다

Objective-C로 작업하십니까? 여전히 자동 릴리스 풀을 관리해야합니다.
autoreleasepool {/ * code * /}

그게 무슨 뜻입니까? 내 코드베이스에 Objective-C 파일이 없다면 autoreleasepool {}불필요 하다는 뜻 입니까?

관련된 질문의 답변 , 예를 들어이 autoreleasepool유용 할 수 있습니다 :

- (void)useALoadOfNumbers {
    for (int j = 0; j < 10000; ++j) {
        @autoreleasepool {
            for (int i = 0; i < 10000; ++i) {
                NSNumber *number = [NSNumber numberWithInt:(i+j)];
                NSLog(@"number = %p", number);
            }
        }
    }
}

위의 코드가 autoreleasepool드롭 된 상태에서 Swift로 번역된다면, Swift는 number변수가 첫 번째 이후에 해제되어야 한다는 것을 알 정도로 똑똑 }할까요 (다른 언어처럼)?


autoreleasepool패턴은 autorelease객체를 반환 할 때 Swift에서 사용됩니다 (Objective-C 코드 또는 Cocoa 클래스를 사용하여 생성됨). autoreleaseSwift 패턴은 Objective-C에서와 매우 유사합니다. 예를 들어, 다음 Swift 변환을 고려하십시오 (인스턴스화 NSImage/ UIImage객체).

func useManyImages() {
    let filename = pathForResourceInBundle

    for _ in 0 ..< 5 {
        autoreleasepool {
            for _ in 0 ..< 1000 {
                let image = NSImage(contentsOfFile: filename)
            }
        }
    }
}

Instruments에서 이것을 실행하면 다음과 같은 할당 그래프가 표시됩니다.

autoreleasepool 사용

그러나 자동 릴리스 풀없이 수행하면 최대 메모리 사용량이 더 높다는 것을 알 수 있습니다.

autoreleasepool없이

autoreleasepool당신이 목표 - C에서 할 수 있었던 것처럼, 오토 릴리즈 객체가 스위프트에 해제 될 때 명시 적으로 관리 할 수 있습니다.

참고 : Swift 네이티브 개체를 처리 할 때 일반적으로 자동 릴리스 개체를받지 않습니다. 이것이 프레젠테이션에서 "Objective-C로 작업"할 때만이 기능이 필요하다는 경고를 언급 한 이유입니다.하지만이 점에 대해 Apple이 더 명확했으면합니다. 그러나 Objective-C 객체 (Cocoa 클래스 포함)를 다루는 경우 자동 해제 객체 일 수 있습니다.이 경우 Objective-C @autoreleasepool패턴 의 Swift 변환 이 여전히 유용합니다.


동등한 Objective-C 코드에서 사용한다면 Swift에서 사용할 것입니다.

Swift는 number 변수가 첫 번째 이후에 해제되어야한다는 것을 알 정도로 똑똑 할 것입니다.}

Objective-C가 작동하는 경우에만. 둘 다 Cocoa 메모리 관리 규칙에 따라 작동합니다.

물론 ARC는 number루프의 반복이 끝날 때 범위를 벗어나는 것을 알고 있으며 이를 유지하면 그곳에서 해제 할 것입니다. 그러나 자동 해제 된 인스턴스를 반환했거나 반환 -[NSNumber numberWithInt:] 하지 않았을 있기 때문에 객체가 자동 해제되었는지 여부는 알려주지 않습니다 . 의 소스에 대한 액세스 권한이 없기 때문에 알 수있는 방법이 없습니다 -[NSNumber numberWithInt:].

참고 URL : https://stackoverflow.com/questions/25860942/is-it-necessary-to-use-autoreleasepool-in-a-swift-program

반응형