자동 해제를 허용하면서 NSMutableData 인스턴스의 바이트 사용
-
28-10-2019 - |
문제
사용하고 있습니다 라코 디스
자동 릴리스 풀이 있지만 Instruments에서 이것을 보면 mutableData
가 할당 해제되지 않는 것 같습니다.
다음과 같이 alloc
/ init
를 사용하는 것을 생각했지만 release
를 보내는 것이 bitmapData
도 제거 할 수 있는지 확실하지 않습니다.
라코 디스
여기서 NSMutableData
를 사용하는 적절한 방법은 무엇입니까?
저는 NSMutableData
와 malloc()
대신 free()
를 사용하는 것이 자동 릴리스 될 것이기 때문에 편리 할 것이라고 생각했습니다.하지만 지금은 그것이 사실인지 모르겠습니다.
해결책
mutableData
가 할당 해제되지 않은 것 같다고 말할 때, CGContextRelease()
시점을 의미합니까, 아니면 할당 해제하지 않고 실행할 때마다 누출된다는 의미입니까?
첫 번째 예에서는 mutableData
를 사용했기 때문에 autorelease 풀이 소모 될 때까지 (일반적으로 이벤트 루프가 끝날 때) -dataWithLength:
가 할당 해제 될 것으로 예상하지 않습니다.두 번째 예에서는 mutableData
가 릴리스되는지 여부가 정의되지 않았습니다.-mutableBytes
에 대한 호출은 포인터가 나머지 이벤트 루프에 대해 유효한지 확인하기 위해 유지 및 자동 해제를 적용 할 수 있지만 (이는 이러한 종류의 메서드에서 매우 일반적 임) 문서에서는 말하지 않으므로 두 번째 예제는 정의되지 않은 동작입니다.나중에 bitmapData
를 사용하는 경우
이제 mutableData
가 유출되면 다른 곳에서 과도하게 유지하는 것입니다.
다른 팁
mutableBytes에 대해 NSMutableData의 인스턴스를 요청하면 단순히 관리하는 기존 (이미 할당 된) 버퍼에 대한 포인터를 반환합니다. 관리 관점에서 메모리에는 영향을주지 않습니다.
따라서 첫 번째 예에서 mutableData가 Instruments에서 볼 때 할당 해제 된 것처럼 보이지 않는다는 사실은 당시의 autorelease 풀 환경과 관련이있을 수 있습니다. 그런 식으로 mutableData를 사용하는 코드에 NSAutoreleasePool이 제자리에 있습니까? 콘솔에 "풀이없는 상태에서 autorelease가 호출되었습니다. 그냥 누수"와 같은 경고가 표시됩니까? 그렇다면 코드를 다음과 같이 래핑하면됩니다. 라코 디스
두 번째 샘플에서는 NSMutableData 인스턴스에서 alloc / init를 사용할 수 있지만 mutableBytes에서 얻은 포인터를 사용한 후에 해제해야합니다. 포인터는 release를 호출 한 후 할당 해제 된 (해제 된) 메모리를 가리키고 액세스하면 무서운 EXC_BAD_ACCESS가 발생합니다.
또한 malloc / free를 사용하는 것은 아마도 메모리가 할당되고 해제되는 방법과시기에 대해 매우 명확하게 알 수 있기 때문에 여기에서 첫 번째 선택 일 것입니다. NSMutableData + autorelease는 객체를 다른 용도로 사용하지 않는 경우 약간의 오버 헤드를 제외하고는 실제로 구매하지 않습니다.