2011-10-25 4 views
6
내가 몇 가지 기능에서 C 문자열을 받고 있어요한다고 가정

:메모리 관리 :있는 NSString의 stringWithCString : 인코딩 :

char * mystring = SomeCFunction(...);

을 그리고 난이 문자열을 소유 (내가 끝났어요 때 그것을 해제를 담당 해요).

NSString * mynsstring = [NSString stringWithCString:mystring 
              encoding:NSUTF8StringEncoding]; 

나는 여전히 원래 C 문자열을 자유롭게에 대한 책임이 : 경우

는 목표 - C에서, 나는 NSString * 사용 만들?

저는 대답이 '예'라고 가정하고 있지만 문서에서 명확한 답을 찾을 수 없습니다. 반대 방법 (cStringUsingEncoding)의 기능은 현명한 것이지만 잠시 멈출 수는 있습니다. 당신을 위해 cString을 해방하십시오.

대답이 '예'인 경우 NSString *을 사용하기 전에 C 문자열을 비우지 않아야합니까? 아니면 함수가 나를 위해 문자열을 복사합니까? stringWithCString에 대한 설명서가 말한다 때문에이 물어 :

은 주어진 C 배열의 바이트를 포함하는 문자열을 반환, 주어진 인코딩에 따라 을 해석했다.

실제로 바이트를 복사했는지, 아니면 그냥 내부적으로 가리키고 있는지 궁금해하고 있습니다. (기본적으로 그냥 캐스트하고 있습니다).

답변

8

바이트를 복사합니다.

바이트를 복사하지 않으려면 대신 - (id)initWithBytesNoCopy:(void *)bytes length:(NSUInteger)length encoding:(NSStringEncoding)encoding freeWhenDone:(BOOL)flag을 사용할 수 있습니다.

- (id)initWithBytes:(const void *)bytes length:(NSUInteger)length encoding:(NSStringEncoding)encoding을 사용하거나 stringWithCString:encoding:과 같은 상용 메서드 자체가이 낮은 수준 메서드를 호출하면 바이트가 복사됩니다.

+0

아! 넌 최고야. 고맙습니다! 수락 차단 타이머가 6 분 남았을 때 대답을 수락합니다. – Steve

+0

이 문서에 나와 있어야합니다 –

+0

@ AndréFratelli 의견을 제출하십시오 (온라인 문서의 각 페이지 하단에 링크가 있습니다). 그래서 Apple이 여기에 추가합니다 .-) – AliSoftware

3

API는 포인터를 어디에서 가져 오는지 알 수 없으므로 포인터가 소유권을 가져 오는 방법을 모릅니다. 그것은 malloc()에서 올 수 있지만, 내부 포인터이거나 mmap() 일 수도 있습니다.이 경우 free()는 작동하지 않습니다. 따라서 API는 데이터를 복사해야합니다.

C 버퍼의 소유권을 Cocoa API에 전달할 수있는 유일한 방법은 API가 해제가 필요하다는 것을 API에서 허용하는 경우입니다. 예를 들어 -[NSData initWithBytesNoCopy:length:freeWhenDone:]을 살펴보십시오.

+0

+1, 네, 많이 만듭니다. 나에게 감각이있다 ... 때로는 애플 문서를 가지고 가끔은 당신이 직접 그런 것들을 추론하도록 남겨 두지 않고, 이런 것들에 대해 조금 더 명백했다. 이 경우 그것은 내가 물어야한다고 생각했던 것을 충분히 망설이게했다. – Steve

+0

충분히 공정합니다. 버그를 제기하고 문서에서 명시 적으로 호출하도록 요청하십시오. – kperryua