나는 객관적으로 다소 새로운 것이지만이 코드에 대한 올바른 메모리 관리가 무엇인지 잘 모르겠습니다.[string UTF8String]에 대한 올바른 메모리 관리
const unsigned char * data =(const unsigned char *) [string UTF8String];
데이터를 무료로 호출하면 오류가 발생합니다. 이 전화 후에 청소해야합니까?
나는 객관적으로 다소 새로운 것이지만이 코드에 대한 올바른 메모리 관리가 무엇인지 잘 모르겠습니다.[string UTF8String]에 대한 올바른 메모리 관리
const unsigned char * data =(const unsigned char *) [string UTF8String];
데이터를 무료로 호출하면 오류가 발생합니다. 이 전화 후에 청소해야합니까?
"UTF8String"에는 단어 alloc
, copy
, retain
또는 create
이 포함되어 있지 않습니다. 따라서, 당신은 그 기억에 대한 책임이 없습니다.
string
이 출시 된 후에 해당 데이터를 계속 사용하려면 복사해야합니다. 계약에 의해, 당신은 그 기억에 대한 책임이 없지만, 당신에게 주어진 물건의 범위를 넘어서지 않을 것이라는 보장은 없습니다.
free
은 필요하지 않습니다.
코코아에서 메서드에 alloc
, init
또는 copy
이라는 단어가 없으면 해당 메서드에서 반환되는 개체를 소유하지 않은 것입니다.
-UTF8String
실제로 포인트 당신이 그것을 호출하는 NSString
개체의 cstring
표현. 개체의 상태가 변경되면 UTF8String
도 변경됩니다.
documentation에 설명 된 것처럼 자동 렌더링 된 오브젝트와 동일한 방식으로 자동 해제됩니다.
기술적으로 free()는 힙에서 malloc()을 사용하여 할당 된 메모리를 제거하는 데 사용됩니다. malloc()을 사용하여 메모리를 할당하지 않았습니다. objective-c는 확장자를 가진 c라는 것을 기억하십시오. 데이터 변수는 C 언어의 '범위 지정'규칙에 따라 메모리에 남아 있습니다.
NSString이 할당 해제되면 C 문자열이 해제됩니다. (또는 개체의 내부 상태가 변경됩니다.) –
이것은 위험한 조언입니다. C 포인터를 다루는 많은 메소드는 메모리를 해제해야합니다. alloc copy retain 규칙은 객체를위한 것입니다. – Chuck
@Chuck : "작성"에 대한 참고 사항을 추가했습니다. "작성"은 Core Foundation 객체도 처리합니다. 호출자가 해당 규칙의 적용을받지 않는 메모리를 해제해야하는 메소드의 예를들 수 있습니까? –