1

initdealloc에 로깅을 추가하여 런타임시 ARC 지원 프로젝트가 점점 더 많은 메모리를 소비하는 이유를 이해하려고 시도했습니다. 한 뷰 컨트롤러가 책임이 있음을 발견했습니다. 초기화 할 때 주된 임무는 NSMutableArray을 만들고 NSNull 개체로 채우는 것입니다. 실행 중에는 더 의미있는 객체에 대해 이러한 null 객체를 스왑하고 그 반대의 경우도 기본 지연로드 설정입니다.ARC에서 NSArray를 nil로 설정

이보기 컨트롤러가 팝되면 그 당시 NSMutableArray에있는 null이 아닌 뷰는 해제되지 않습니다. 결과적으로 뷰 컨트롤러 자체도 해제되지 않습니다.

NSMutableArray을 비우거나 nil로 설정하여이 문제를 해결할 수 있습니다.

무엇이 필요합니까? ARC 하에서조차도 배열을 nil로 설정하는 것은 항상 나의 책임입니까? 아니면 배열의 객체 중 하나를 유지하고 자동으로 할당을 해제하지 못하게해야합니까?

+0

NSMutableArray가 인스턴스 변수 (전역 변수가 아님)라고 가정하면보기 컨트롤러가 해제 될 때 해제되어야합니다. 보기 컨트롤러 자체가 해제되었음을 확인 했습니까 (예 : 'dealloc'에서 중단 점 또는 'NSLog'). 당신이 터지기 만해도 강하게 참조주기 (일명주기 유지)로 고통 받고있는 경우와 같이 공개 된 것은 아닙니다. – Rob

+0

글쎄, 배열이 초기화되지만 채워진 적이 없다면 (즉, 팝업시 널 객체 만 포함되어 있음) View Controller가 해제되었다는 것을 알았습니다. 나는 이것을 'dealloc'에 로그인하여 확인했다. 그게 도움이 되니? –

+1

'dealloc'호출 여부를 다시 한 번 채우고 팝업되는지 확인하십시오. 그렇다면 인스턴스 변수가 해제되어야합니다. 'dealloc'이 호출되지 않는다면 아마도 강한 참조주기 일 것입니다 (예를 들어 뷰 컨트롤러 자체가이 'NSMutableArray'에서 참조 된 경우 강한 참조주기가 발생합니다). – Rob

답변

1

NSMutableArray이 인스턴스 변수라고 가정하면보기 제어기가 해제 될 때 해제되어야합니다. NSMutableArrayNSNull 개체 만있을 때 컨트롤러의 dealloc이 호출되고 있는데 배열을 "의미있는"콘텐츠로 채울 때 할당이 해제되지 않으면 의심 할 여지없이 strong reference cycle이됩니다. 즉보기 컨트롤러에 대한 참조가 있어야합니다. , 자체는 NSMutableArray의 내용입니다.