2011-10-25 14 views
6

は、私はいくつかの関数からC文字列取得していたとしますメモリ管理:NSStringののstringWithCString:エンコーディング:

char * mystring = SomeCFunction(...);

をそして、私はこの文字列を所有して(私は終わりだときにそれを解放する責任です)。

Objective-Cで、私が使用してNSString *を作成、場合:

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

は、元のC文字列を解放するために、私はまだ担当していますか?

私は答えがイエスだと仮定していますが、ドキュメントで決定的な答えを見つけることができません。反対の方法(cStringUsingEncoding)の機能は、官能的ですが、あなたのためにcStringを解放する。

回答が「はい」の場合は、NSString *を使用する前にC文字列を解放しないようにするか、関数が文字列をコピーしますか?

は、与えられたCの配列でバイトを含む文字列を返します。与えられたエンコーディングに従って を解釈:stringWithCStringのドキュメントがそれを言うので、私はこれを頼みます。

これは実際にバイトをコピーしたのか、それとも内部的に指しているのか不思議に思っています(基本的にはキャストしています)。

答えて

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はあなたがそれを渡すポインタがどこから来たのかわからないので、APIの所有権を取得する方法はわかりません。これはmalloc()でも可能ですが、内部ポインタでもmmap()でもかまいません。この場合free()は動作しません。したがって、APIはデータを強制的にコピーします。

Cバッファの所有権をCocoa APIに渡すことができるのは、APIが解放する必要があることをAPIに通知できる場合だけです。例えば、-[NSData initWithBytesNoCopy:length:freeWhenDone:]を見てください。

+0

+1、そうですね。私にとっての意味は...時にはアップル社のドキュメントでは、このようなことについてもう少し明示されました。この場合、それは私が私が尋ねるべきであると思ったほど長く躊躇しました。 – Steve

+0

十分に公正。バグを報告し、ドキュメントで明示的に呼び出されるようにしてください。 – kperryua