2016-10-06 3 views
0

나는 Swift에서 응용 프로그램을 개발 중이며 Objective-C가 아닌 비 원형 (non-arc Objective-C) 배경에서 왔습니다. 나는 기억 문제를 만났다. 그래서, 내 ViewControllers에서 deinit을 구현했습니다. 그들 중 누구도 부름을받지 못했습니다. 일부 코드 예 :스위프트 메모리 관리

@objc protocol ServerDelegate { 
    @objc optional func onUpdateComplete() 
} 

var delegate_ : ServerDelegate? 

내 모든 대리인이 강력한 참조로 설정되어있는 것으로 나타났습니다. 그래서 나는 그들에게 같은 약한 참조했다 :

@objc protocol ServerDelegate : class { 
    @objc optional func onUpdateComplete() 
} 

weak var delegate_ : ServerDelegate? 

을 지금 deinit 각각의 ViewController 호출됩니다.

그러나 메모리를 볼 때 Navigation Controller에서 View Controller를 팝하면 해제됩니다. 예를 들어, 처음 10MB의 메모리가 할당 된 장면에서 뷰 컨트롤러를 밀었 고 메모리는 15MB로 증가했습니다. 이제 팝업 할 때 deinit이 호출되었지만이 5MB는 해제되지 않았습니다. 하지만 내가 다시 밀면. 메모리가 20MB로 증가하지 않습니다. 15MB로 유지됩니다. 왜 이런 일이 일어나는 걸까요? 이게 정상인가? 이미지가 캐시되고 해제되지 않습니까? View Controller를 팝업 할 때 수동으로 해제 할 수 있습니까? 감사.

답변

1

문서 당 이미지 용 시스템 캐시가 UIImage.init(named:)입니다. 수동으로 플러시 할 수는 없지만 Apple의 디자인 의도는 모든 NSCache 유형의 캐시처럼 메모리가 부족 해지면 자동으로 플러시됩니다. 따라서 모든 플러시가 이루어지면 플러시에 필요한 프로세서 사이클의 캐시 히트와 지출이 줄어들 것입니다.

캐시를 피하려면 설명서에 imageWithContentsOfFile:을 사용하는 것이 좋지만 XIB 또는 스토리 보드에서로드하거나로드하는 경우 영향을 줄 수있는 충분한 직접 제어 권한이 없습니다.

+0

감사합니다. @ 토미. 예, 스토리 보드에서로드 중입니다. 제 경우에는 메모리 할당이 괜찮습니까? – kashif789us

+0

새 수량이 누적되지 않아야합니다. Instruments Leaks 도구를 사용하여 자신감이 있는지 확인해 볼 수는 있지만 괜찮은 것 같아요. 애플의 정책은 일종의 무거워서 (이상한 깜짝 선물) 항상 이상적이지는 않지만 여기서는 틀렸다는 생각은하지 않는다. – Tommy

+0

프로파일 러를 점검했는데 누수가 없습니다. – kashif789us