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 코드 또는 코코아 클래스를 사용하여 생성).autorelease
Swift의 패턴은 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 때문에):
그러나 자동 릴리스 풀을 사용하지 않고 이 작업을 수행하면 최대 메모리 사용량이 더 높다는 것을 알 수 있습니다.
그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
'programing' 카테고리의 다른 글
Ajax와 Symfony2를 통합하는 방법 (0) | 2023.08.30 |
---|---|
Powershell 내에서 폴더를 여는 방법 (0) | 2023.08.30 |
ASP.NET MVC Ajax 오류 처리 (0) | 2023.08.30 |
각도 단위 테스트 입력 값 (0) | 2023.08.30 |
텔레릭을 사용하여 Excel(XLSX)로 내보낼 때 컬렉션을 해석하는 방법은 무엇입니까? (0) | 2023.08.30 |