2013-01-15 3 views
2

NSCoder로 인코딩 된 루트 객체를 가져 왔으며 반환 된 객체를 메모리 관리하는 방법을 모릅니다. 나는 autorelease 풀로 그것을 둘러 쌌지 만, 객체는 풀과 함께 나가지 않습니다. Code Here, See line 289Git Hub 커밋과 함께 회선과 코드가 변경 될 수 있지만 궁극적으로 작업 코드에서 손가락이 엇갈린 상태로 표시됩니다.NSCoder에서 반환 된 디코딩 된 객체의 메모리를 어떻게 관리합니까?

버젼 : retainCount 방법 unpredictable

보증이란 무엇인가? 완벽하게 디코딩 된 객체의 할당을 해제하는 방법?

+0

예상보다 오래 머물러있는 물체는 무엇입니까? 일반적인 메모리 관리 규칙을 따르는 한 "할당 해제"에 대해 걱정할 필요가 없습니다. –

+0

이 객체는 매우 많은 양의 데이터를 처리 할 가능성이 있으므로 최소한 제거가 임박했는지 반드시 알아야한다고 주장합니다. – cxx6xxc

답변

0

NSCoder는 해당 릴리스 풀에 속해 있지 않습니다. 같은 파일에 쓰기로 - 당신은 메모리를 관리하는

+0

나는 풀을 가져 갔다. 그렇다면 지금은 글로벌인가? – cxx6xxc

1

NSKeyedArchiver. 당신 하나가 명시 적으로 유지하고, 당신이 완료되면 해제 전화, 또는 즉시 사용할 필요가

에서 돌아왔다.

I 추천 다시 익숙 Memory Management Rules for Objective-C

수동 메모리 관리와 함께 자신하는 것은 처음에는 조금 까다 롭습니다,하지만 당신은 규칙의 묘리를 터득하면,이를 통해 작업이 같은 상황은 매우 쉽습니다.

이제 메모리를 즉시 제거해야하는 경우 호출자가 명시 적으로 메모리를 소유 할 수 있도록 alloc : init 패턴을 따르는 자체 바이너리 serializer를 작성해야합니다. 그렇게하면 객체에서 release를 호출하면 할당이 해제됩니다.

+0

내 테스트 기능을 지키지 않고 계속 유지됩니다. dealloc 프로세스를 최소한으로 시작하지 못했을 때 누수로 간주되지 않습니까? 275 행 : https://github.com/cxx6xxc/Node/blob/master/nodeInterface.m – cxx6xxc

+0

아니요. 누출이 아닙니다. 메모리가 할당되면 내부적으로 AutoRelease 풀에 추가되고 풀을 비우면 할당이 해제됩니다. IIRC는 OS에 의해 관리되기 때문에 AutoRelease 풀이 비었을 때 제어 할 수 없습니다. 검증을 원할 경우, 수동으로 객체에 release를 호출하면 ref 수를 감소시키고 메모리를 해제해야합니다 (단, AutoRelease 풀이 비면 매우 나쁜 버그가 발생합니다 - 그래서 그대로 두지 마십시오!). !). – Alan

+0

다른 기본 autorelased 인스턴스와 다르게 작동하는 것 같습니다. 예를 들어, autoreleased되면 NSString 유지해야합니다. 반면에 NSCoder 객체를 유지하는 것은 앱 이벤트 루프를 통해 여러 번 메모리에 상주하므로 관련성이 없어 보입니다. 테스트를 위해 4 개의 보유 메시지가 있음을 의미하는 4 개의 릴리스 메시지를 보냈습니다. 나중에 애플리케이션 종료시 일반적인 릴리즈 세분화를 얻지 않습니다. 그래서, 왜 NSCoder가 이것을하고 있는지 혼란 스럽습니다. 일관되게 행동하지 않는 것 같습니다. – cxx6xxc

관련 문제