ブログランキング・にほんブログ村へ


iPhone/iPad用潜水艦ゲームアプリ ソナーエコー iTunesにて公開中

2012年04月19日

NSString cStringUsingEncoding ポインタ

const char *chars = [textString cStringUsingEncoding:NSUTF16StringEncoding];

というようなことをやる必要が出てやったんだけど、こんなポインタいきなり渡されてどうしろと。

ポインタを渡されたってことは解放しなくちゃいけないんじゃないのか。C++脳的には。delete はないからfreeか?
いやなんか変だ。
ぐぐると、解放しなくてもいいってことらしい。NSStringが解放されたときに一緒に解放されると。
つまりあれだ、C++的に考えると
class NSString {
   char* pTmpCString;
public:
   NSString():pTmpCString( 0 ){}
   ~NSString(){ delete [] pTmpCString; }
   char const* cStringUsingEncoding( int encodeType ){
       if( pTmpCString )delete [] pTmpCString;
       元文字列をエンコードしてpTmpCStringをnew char[ length ]する処理
       return pTmpCString;
   }
};
となっているっていう理解でいいのか。
すると次の疑問がわく。
NSString自体もなんらかのエンコードで文字列を保持しているはずだが、cStringUsingEncodingで要求されたエンコード形式とそれが一致した場合は、そのポインタそのものを返すのか、それともわざわざコピーしてから返すのか。
あと連続して2種エンコードした場合、ポインタは両方有効なのか。
つまり
const char *chars1 = [textString cStringUsingEncoding:NSUTF16StringEncoding];
const char *chars2 = [textString cStringUsingEncoding:NSUTF8StringEncoding];
とかやると、char2を取得した時点でchar1のポインタは無効になっていないか。
上に書いたC++擬似コードだとchars1はchar2を得たときには既に解放されてしまっている。

それから、この仕組みだとNSStringをスレッドの間でまたがって使うのはポインタ取得時のみの排他処理では不可能ということになる。

うーむ、今時リエントラントコードを書くのが困難とか、好きになれない感じだぞ。Objective-C。

2012.8.24
これ書いてからだいぶたって今は、このポインタってのはNSObjectのメンバの一部で、そのNSObject自体alloc -> autoreleaseになってるって理解が一番apple的だろうと思う。
それだとリエントラントコードには問題ないことになる。
試してないけど。
posted by みこあいさ at 10:47| iOS開発