programing

Swift 프로그램에서 자동 해제 풀을 사용해야 합니까?

lastcode 2023. 8. 30. 21:45
반응형

Swift 프로그램에서 자동 해제 풀을 사용해야 합니까?

WWDC14 프레젠테이션의 17페이지에 다음과 같이 나와 있습니다.

목표-C로 작업하시겠습니까?여전히 자동 릴리스 풀을 관리해야 함
자동 해제 풀 { /* 코드 */ }

그게 무슨 의미죠?만약 내 코드 베이스에 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떨어졌습니다, 스위프트가 똑똑해서 그것을 알 수 있을까요?number변수는 첫 번째 이후에 해제되어야 합니다.}(다른 언어들처럼)?

autoreleasepool반품시 Swift에서 패턴이 사용됩니다.autorelease객체(Objective-C 코드 또는 코코아 클래스를 사용하여 생성).autoreleaseSwift의 패턴은 Objective-C에서와 마찬가지로 기능합니다.예를 들어, 이 방법의 빠른 버전을 생각해 보십시오(인스턴트).NSImage/UIImage객체):

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

이를 Instruments에서 실행하면 다음과 같은 할당 그래프가 표시됩니다.5다음과 같은 작은 언덕(외부 for-loop 때문에):

with autoreleasepool

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

without autoreleasepool

autoreleasepool에서는 Objective-C에서와 마찬가지로 Swift에서 자동 릴리스 개체의 할당 해제 시기를 명시적으로 관리할 수 있습니다.

참고: Swift 기본 개체를 다룰 때는 일반적으로 자동 릴리스 개체를 수신하지 않습니다.이것이 프레젠테이션이 Apple이 이 점에 대해 좀 더 명확했으면 좋겠지만 "Objective-C로 작업"할 때만 필요하다는 경고를 언급한 이유입니다.그러나 Objective-C 개체(코코아 클래스 포함)를 다루는 경우에는 자동 릴리스 개체일 수 있으며, 이 경우 Objective-C의 신속한 버전입니다.@autoreleasepool패턴은 여전히 유용합니다.

동일한 목표-C 코드에서 사용할 경우 Swift에서 사용할 수 있습니다.

Swift는 숫자 변수가 첫 번째 } 이후에 해제되어야 한다는 것을 알 수 있을 정도로 똑똑합니까?

목표-C가 수행하는 경우에만 해당됩니다.둘 다 코코아 메모리 관리 규칙에 따라 작동합니다.

물론 ARC는 알고 있습니다.number루프의 반복이 끝나면 범위를 벗어납니다. 루프가 유지되면 해당 루프를 해제합니다.그러나, 그것은 당신에게 객체가 자동으로 해제되었는지 여부를 알려주지 않습니다, 왜냐하면-[NSNumber numberWithInt:] 자동 릴리스된 인스턴스를 반환했거나 반환하지 않았을 수 있습니다.소스에 액세스할 수 없기 때문에 알 수 있는 방법이 없습니다.-[NSNumber numberWithInt:].

@autoreleasepool목표-C 및 스위프트 코드에서 사용할 수 있으며, 이 코드는 다음에 의존합니다.autorelease

[후드 아래]

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

반응형