문제

사용하고 있습니다 라코 디스

자동 릴리스 풀이 있지만 Instruments에서 이것을 보면 mutableData가 할당 해제되지 않는 것 같습니다.
다음과 같이 alloc / init를 사용하는 것을 생각했지만 release를 보내는 것이 bitmapData도 제거 할 수 있는지 확실하지 않습니다. 라코 디스

여기서 NSMutableData를 사용하는 적절한 방법은 무엇입니까?

저는 NSMutableDatamalloc() 대신 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는 객체를 다른 용도로 사용하지 않는 경우 약간의 오버 헤드를 제외하고는 실제로 구매하지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top