2017-10-16 1 views
0

간단히 말하자면 중지 될 때까지 가능한 한 많은 메모리를 쉽게 먹을 수있는 코드 스 니펫입니다. 하지만 왜? 범위 내에서 while을 랩핑하면 autoreleasepool에 단일 바이트가 유출되지 않습니다. 그러나 현재 범위에만 영향을줍니다. 누출 된 함수 호출이 있으면 누출이 계속됩니다. 그래서 자동 응답 풀에서 누수가 발생하기 쉬운 작업을 마무리하는 것입니다. 그것은 좀 우스꽝스럽고 비 슬퍼 보인다.Swift에서 Foundation.Data 메모리 누수가 발생했습니다.

import Foundation 

while true { 
    let _ = "Foo Bar".data(using: .ascii) 
    usleep(100) 
} 
+0

비교 https://stackoverflow.com/questions/25860942/is-it-necessary-to-use-autoreleasepool-in-a-swift-program –

답변

0

이것은 예기치 않은 것이 아닙니다. while이 실행 루프에 제어를 반환 할 때까지 최상위 레벨 자동 해제 풀이 비워지지 않습니다. 그것에 집어 넣은 물건은 계속 축적 될 것입니다.

ARC가 Data 인스턴스를 즉시 삭제하지 않는다는 사실에 조금 놀랐습니다. 그러나 "잘라 내기"에 할당하면 해당 범위에 결코 적용되지 않습니다. 당신이 그들을 언급 할 수있는 이름이 없으며, 그들을 지킬 이유가 없습니다.

+0

여기에 데이터를 누설하는 또 다른 예가 _에 지정되지 않았습니다. 'func leak() { "Foo Bar".data (using : .ascii); }; while true {누수(); 수면 (10); }'그리고 이것은 훨씬 의미가 없습니다. –

+0

같은 추론이 있습니다. 실행 루프로 다시 돌아 가지 않으므로 자동 출시 된 객체는 정리되지 않습니다. 'while'을 얼마 동안 실행 한 다음에는 어떤 일이 일어나는지 봅니다. –

관련 문제