2010-04-29 3 views
4

나는 객관적으로 다소 새로운 것이지만이 코드에 대한 올바른 메모리 관리가 무엇인지 잘 모르겠습니다.[string UTF8String]에 대한 올바른 메모리 관리

const unsigned char * data =(const unsigned char *) [string UTF8String]; 

데이터를 무료로 호출하면 오류가 발생합니다. 이 전화 후에 청소해야합니까?

답변

10

"UTF8String"에는 단어 alloc, copy, retain 또는 create이 포함되어 있지 않습니다. 따라서, 당신은 그 기억에 대한 책임이 없습니다.

string이 출시 된 후에 해당 데이터를 계속 사용하려면 복사해야합니다. 계약에 의해, 당신은 그 기억에 대한 책임이 없지만, 당신에게 주어진 물건의 범위를 넘어서지 않을 것이라는 보장은 없습니다.

+1

NSString이 할당 해제되면 C 문자열이 해제됩니다. (또는 개체의 내부 상태가 변경됩니다.) –

+1

이것은 위험한 조언입니다. C 포인터를 다루는 많은 메소드는 메모리를 해제해야합니다. alloc copy retain 규칙은 객체를위한 것입니다. – Chuck

+0

@Chuck : "작성"에 대한 참고 사항을 추가했습니다. "작성"은 Core Foundation 객체도 처리합니다. 호출자가 해당 규칙의 적용을받지 않는 메모리를 해제해야하는 메소드의 예를들 수 있습니까? –

2

free은 필요하지 않습니다.

코코아에서 메서드에 alloc, init 또는 copy이라는 단어가 없으면 해당 메서드에서 반환되는 개체를 소유하지 않은 것입니다.

-UTF8String 실제로 포인트 당신이 그것을 호출하는 NSString 개체의 cstring 표현. 개체의 상태가 변경되면 UTF8String도 변경됩니다.

+0

이 메서드에서 반환 된 개체가 없으므로 개체에 대한 메모리 관리 규칙과 관련이 없습니다. – Chuck

+0

필자는 항상 문자열이 NSData 객체로'-dataUsingEncoding : NSUTF8StringEncoding'으로 변환되고 그 결과가'NSData' 객체의'bytes' 메소드라고 생각합니다. 나는 두려운 것을 시도하고 보려고 귀찮게하지 않았으므로 나는 이것에 대해 틀릴 가능성이있다. – dreamlax

2

documentation에 설명 된 것처럼 자동 렌더링 된 오브젝트와 동일한 방식으로 자동 해제됩니다.

0

기술적으로 free()는 힙에서 malloc()을 사용하여 할당 된 메모리를 제거하는 데 사용됩니다. malloc()을 사용하여 메모리를 할당하지 않았습니다. objective-c는 확장자를 가진 c라는 것을 기억하십시오. 데이터 변수는 C 언어의 '범위 지정'규칙에 따라 메모리에 남아 있습니다.