• 締切済み

Objective-C文字列からC言語文字列に変換したいのですが、どう

Objective-C文字列からC言語文字列に変換したいのですが、どうすればよいでしょうか? C言語からObjective-cなら NSString *cToOc = [[NSString alloc] initWithCString:"結果" encoding:NSUTF8StringEncoding]; NSLog(@"%@", cToOc); でよいのですが、その逆が知りたいです。 あとこの cToOcは以下のように解放しないといけないのでしょうか? [cToOc release];

みんなの回答

  • harawo
  • ベストアンサー率58% (3742/6450)
回答No.2

> よくわかっていないのですが、 「retain」、「release」、「autorelease」いずれもNSObjectのプロトコルなので、NSObject Protocolレファレンスで調べれば、わかります。 こういうことをいうと、反発されるだけかもしれませんが。英文のリファレンスを読めることが、Cocoa、iPhone SDK開発の、最低条件なので、英語がわからないといういいわけは、聞き入れることができません。まえもって、お断りしておきます。

mikkychan2
質問者

お礼

>英文のリファレンスを読めることが、Cocoa、iPhone SDK開発の、最低条件 なるほど、最低条件すら知りませんでした。 英語を避けてはいけないのですね。

  • harawo
  • ベストアンサー率58% (3742/6450)
回答No.1

NSStringのインスタンスメソッドに「cStringUsingEncoding:」があります。NSStringのリファレンスを調べれば、すぐに見つかるはずですが? > あとこの cToOcは以下のように解放しないといけないのでしょうか? はいそうです。 代わりに「stringWithCString:encoding:」を使うと、release不用です。 NSStringにかかわらず、すべてのクラスのイニシアライザについて、「init」で始まるものと、クラス名で始まるもので、おなじ仕事をするメソッドがあることに気づきますが、このふたつの違いは、自動でretainするか、自動でautoreleaseするかです。いちど使ったら、すぐに不用になるインスタンスは、後者でイニシアライズするといいでしょう。

mikkychan2
質問者

お礼

ご回答ありがとうございます。 よくわかっていないのですが、 initで始まるものは 自動でretain? releaseは手動 クラス名(stringWithCStringがクラス名)で始まるものは 手動でretain? 自動でreleaseされる という意味でしょうか?

関連するQ&A

  • objective-cとC++の連携

    cocos2dを使ってobjective-cの関数を呼び出したい場合、返り値がstringなどvoidでないときどう記述すればいいのでしょうか? //DBClassBridge.h string DBClassBridge::getStringColumn(string table, string field, string where, id target) { [DBClass_objc getStringColumn:[[[NSString alloc] initWithCString:table.c_str() encoding:NSUTF8StringEncoding] autorelease] field:[[[NSString alloc] initWithCString:field.c_str() encoding:NSUTF8StringEncoding] autorelease] where:[[[NSString alloc] initWithCString:where.c_str() encoding:NSUTF8StringEncoding] autorelease] target:(id)target];   //return ?? } returnのあとに何か入れる感じですかね? わかる人いたら是非お願いします。

  • 【Objective-C】文字列の連結でいい方法ありませんか?

    Objective-Cで文字列、NSStringの連結をするのに、stringByAppendingString:を使って以下のように書きました。 NSString *str1 = @"AAA"; NSString *str2 = [str1 stringByAppendingString: [NSString stringWithCString: "BBB" encoding: NSUTF8StringEncoding]]; しかし、この冗長なコードを何度も書くのは大変です。 そこで、マクロを使って以下のように整理してみました。 #define AS(A,B) [(A) stringByAppendingString:([NSString stringWithCString: B encoding: NSUTF8StringEncoding])] NSString *str2 = AS(str1,"BBB"); 少しはマシになりましたが、できれば+演算子を使って、以下のような、直感的にもわかるコードにしたいです。 NSString *str2 = str1 + "BBB"; NSStringクラスの+プラス演算子を書き換えて、(メソッドオーバーライド) NSString *str2 = str1 + "BBB"; の様ななコードを書く事はObjective-Cで、できるのでしょうか? 以上、ご指導のほど、宜しくお願いいたします。

  • C(char *s1)の文字列をObjective-Cの文字列(NSS

    C(char *s1)の文字列をObjective-Cの文字列(NSString *s2)にするにはどうしたらよいのでしょうか? char s1[] = "abc"; NSString *s2 = [[NSString alloc] initWithUTF8String:s1];  // (A) NSLog(@"s2=[%s]", s2); 結果がabcかなと思っていましたが、読めない変な文字が表示されました。 (A)を NSString *s2 = [NSString stringWithFormat:@"%s", s1]; に変えても同じでした。 s1のC文字列は日本語を含まないアルファベットの文字列なのになぜ?と 困っています。 Objective-Cの初心者で申し訳ありません。

  • locale::idとid型について

    objective-cでなんでも入れられるid型がありますが、cocos2dの環境下でc++から呼び出したいときにidにあう型がありません。一応std::local::idというのを見つけたのですが void DBClassBridge::updateColumn(string table, string field, locale::id input, string where, string target) { [DBClass_objc updateColumn:[[[NSString alloc] initWithCString:table.c_str() encoding:NSUTF8StringEncoding] autorelease] field:[[[NSString alloc] initWithCString:field.c_str() encoding:NSUTF8StringEncoding] autorelease] input:(id)input //ここでエラー where:[[[NSString alloc] initWithCString:where.c_str() encoding:NSUTF8StringEncoding] autorelease] target:[[[NSString alloc] initWithCString:target.c_str() encoding:NSUTF8StringEncoding] autorelease]]; } 以下のようなエラーが出ます。 Cannot convert 'locale::id' to 'id' without a conversion operator やはりデータ型があっていないっぽいです。 objective-cのid型にはどのデータ型を用いればいいのでしょうか?またはlocal::idからidへとどう変換すればいいのでしょうか? 知っている方、是非お願いします。

  • Objective C(iPhone SDK)でテキストファイルから一

    Objective C(iPhone SDK)でテキストファイルから一行毎データを読み出す方法を教えてください. つい最近Objective-Cを始めた初心者です. サーバ上にあるテキストファイルを読み込み,一行ごとデータを取り出し,その一行ずつ取り出したデータをTableViewの項目として表示したいと思っています.現在コンパイルが出来ているのは, NSString* text; NSString* path = @"(URL)test.txt"; NSError* error; text = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:&error]; までです.また,読み込むテキストファイルの内容は 0001 0002 0003 0004 [EOF] となっています.このデータの一行ずつを配列に格納する方法を教えてください,よろしくお願いします.

  • Objective-Cで、NSStringのオブジェクトの解放を行って

    Objective-Cで、NSStringのオブジェクトの解放を行っているサンプルをよく見るのですが NSString *s = @"test"; const char *p = [s UTF8String]; [s release]; ... ここでpにアクセスするとどうなるのでしょうか? [s release]とおおもとを解放しているので怪しいと思いますがそれは正しいでしょうか? あと関数内なら [s release]としなくても自動解放?(ガーベージコレクション) はしてくれるのでしょうか? Objective-Cでのメモリの有効期間や解放について詳しくかかれている本やサイトの情報も探しています。

    • ベストアンサー
    • Mac
  • Objective-Cのメモリ管理について

    iPhoneのUIBarButtonItem(右上のボタン)を押すと、xamppのPHPで作ったwebサーバーにPOSTを送り、送ったPOSTの内容で異なるデータをiPhoneに返す仕組を作っていたら、Objective-Cのメモリ管理でつまづきました。 どうすれば以下のソースにあるNSString *strがメモリ解放されないかを知りたいです。 【ソース】 - (void)connection:(NSURLConnection*)connection didReceiveData:(NSData*)data { //PHPのデータ char* p = (char*)[data bytes]; NSString *str = [[NSString alloc] initWithUTF8String:p]; NSLog(@"str_RETAIN:%d",[str retainCount]); ←問題の箇所 NSRange rng; rng = [str rangeOfString:@"比較したい文字列"]; if(rng.length > 0) ...以下、strに関係する部分はないので省略 } この時、NSStringでalloc,initWithUTF8Stringを呼び出した後のNSLogのretainCountは呼び出すたびに常に1が出るようにしたいのですが、なぜか0になったり1になったりしてしまいます。 コンソール画面で何度も試しましたが、0になったり1になったりするのに法則性がなく、最初0で次押すと1,1,1,0,1,1,0とか、最初1,0,1,0,0,1,1,1,1,1...など、乱数のような状況になってます。 なので、0になった場合は、セットした値が無くなってしまっていて、次の部分文字列の比較(rng = [str rangeOfString:@"比較したい文字列"];)の部分で正しい動作ができなくなってしまってます。 送られてくるPHPのデータ(char *)は特に問題なさそうです。 後、サーバーに接続出来ない場合は、別の処理でエラー判定が出来るようになっているので、最初からデータがないという事はないです。 分かる方いましたら、ご回答お願いします。

  • 【Objective-c】rubyの__send__みたいな使い方がしたい。

    Objective-cで、rubyの__send__みたいな使い方がしたいです。 例えば以下のようなインターフェィスのクラスがあるとします。 @interface Hoge : NSObject { } - (NSString*)retA; - (NSString*)retB; @end ある条件によって、このクラスのメソッドの呼び別けたいです。 そこで以下のように書いたのですが、コンパイルが通りませんでした。 Hoge* hoge = [[Hoge alloc] init]; NSLog(@"%@",[hoge sw ? retA : retB]); rubyだとこんな感じです。 hoge.__send__(sw ? "retA" : "retB") ご指導のほど、宜しくお願いいたします。

  • Objective-CでNSStringを複製

    ユーザが入力した文字列を、プログラムの内部データとして保持したいと考えています。 そこで、TextFieldを用意し、そこへ入力した文字を一旦別のクラスのメンバへ複製しようとしています。 保持するクラスにこんなメソッドを用意しました。 -(void) SetText( NSString* para) {   member = [[NSString alloc] initWiithString : para ]; } para で渡された文字列と同じ内容のインスタンスを生成して member で保持しようとしたわけです。 しかし、デバッガでstep実行すると、 member には para と同じアドレスが代入されます。 alloc と言っているので、C++ のnew のような動き(別インスタンスを生成)をイメージをしていたのですが、代入演算子と同じ動きをしていました。 そのため、para が release されてしまうと、この member から文字列を取り出せなくなってしまいます。 (解放済みオブジェクトにアクセスするので例外になります。当然ですけど) このほかには member = para; [member retain] とか、 member = [para copy]; などを試しましたが、いずれも一緒でした。 理由がわかる方、いらっしゃいましたら教えてください。 また、要は textFieldの文字列を別のviewに引き継ぐために、textField がrelease される前に保持したいのですけど、他に有効な方法を教えて頂けたら幸いです。

  • iPhoneアプリ開発 ファイル書き込み

    iPhoneアプリ開発につきまして、質問させて頂きます。 csvファイルへのデータの出力を試みているのですが上手くできません。 プログラムとログ内容を以下に記述しました。 「abc」と予め書いてある「hoge.csv」ファイルに「stringaaaaaaaaaaa」を書き込み保存しておきたいのですが、上手くいきません。 ログ内容を見る限り、「abc」が読み込めているので、パスは合っていると思っています。また、writeToFileをしてから読み込むと「stringaaaaaaaaaaa」が読み込めるため、どこかには書き込めているような気がします。 しかし、毎回同じ処理をしても、最初に読み込まれるのは「abc」です。「hoge.csv」をテキストエディタで読み込んでも表示されるのは「abc」です。 また、iPhoneシミュレーターで実行した結果は以下のログ内容なのですが、iPhone実機で動作させると、writeToFileを行ったあとでも「abc」が出力されます。 何か原因を思い当たる方、教えて頂ければ幸いです。 - (void)viewDidLoad { [super viewDidLoad]; [self setTitle:@"Stress Application"]; printf("viewdidload"); NSString *text = [[NSString alloc] initWithFormat:@"stringaaaaaaaaaaaaaaa"]; NSString *_path = [[NSBundle mainBundle] pathForResource:@"hoge" ofType:@"csv"]; //atomicallyは補助ファイルを使ってファイルの破損を防止するかどうか NSLog(@"%@",[NSString stringWithContentsOfFile:_path encoding:NSUTF8StringEncoding error:nil]); [text writeToFile:_path atomically:YES encoding:NSUTF8StringEncoding error:nil]; NSLog(@"%@",[NSString stringWithContentsOfFile:_path encoding:NSUTF8StringEncoding error:nil]); NSLog(@"%@",text); } <ログ内容> 2012-10-31 12:35:10.187 ThinkGearTouch[17182:1a903] FinishLaunching viewdidload2012-10-31 12:35:10.204 ThinkGearTouch[17182:1a903] abc 2012-10-31 12:35:10.212 ThinkGearTouch[17182:1a903] stringaaaaaaaaaaaaaaa 2012-10-31 12:35:10.212 ThinkGearTouch[17182:1a903] stringaaaaaaaaaaaaaaa