- ベストアンサー
Objective-Cのメモリ管理について
- iPhoneのUIBarButtonItem(右上のボタン)を押すと、xamppのPHPで作ったwebサーバーにPOSTを送り、送ったPOSTの内容で異なるデータをiPhoneに返す仕組を作っていたら、Objective-Cのメモリ管理でつまづきました。
- NSStringでalloc,initWithUTF8Stringを呼び出した後のNSLogのretainCountが0や1になったりしてしまい、セットした値が無くなってしまっていて、次の部分文字列の比較が正しく動作しなくなっています。
- 送られてくるPHPのデータは問題なさそうですが、なぜretainCountが乱数のように振る舞うのか分かりません。どうすればNSString *strがメモリ解放されないか知りたいです。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
質問にお答えする前の段階で、問題がいくつかありますので、まずそちらを指摘しておきます。 (1) 受信したデータの取り出しは、Delegateメソッド「- (void)connectionDidFinishLoading:(NSURLConnection *)connection」で行ってください。メソッド「- (void)connection:(NSURLConnection*)connection didReceiveData:(NSData*)data」は、データダウンロードの途中経過で受け取るものです。ガイドライン「URL Loading System Programming Guide」の「Using NSURLConnection」の項に、サンプルコードがあるので、それで勉強してください(というより、丸写しで可)。 (2) NSStringのメソッド「initWithUTF8String:」は、UTF8の文字列を、Objective-C文字列に変換するもので、C言語の文字列をObjective-Cの文字列に変換するものではありません。元のデータがUTF8の文字列で、間違いありませんか?文字コード0~127までは、UTF8、ASCII共通なので、どちらを使っても、同じ結果になるはずですが、もちろん間違ったメソッドを使うと、間違った結果になることがあります。C言語の文字列を、Objective-Cの文字列に変換するには、「- (id)initWithCString:(const char *)nullTerminatedCString encoding:(NSStringEncoding)encoding」を使います。 (3) メソッド「retainCount」で、「0」が返ってくることはありえません。なぜなら、Retain Countが0ということは、対象のオブジェクトが開放されていることを意味しますから、開放されたオブジェクトにアクセスすると、「間違ったアクセス」というエラーが返ってきます。 今回のケースでは、コード「NSString *str = [[NSString alloc] initWithUTF8String:p];」が成功しているのかどうかを、まず怪しむべきでしょう。strの内容が、nilでないことを、事前に確認するところだと思います。
お礼
yahoo知恵袋でも回答していただき、ありがとうございます。 yahoo知恵袋で書き込んだ内容 --------------------------------------------------------------------------------------------- 素早い回答本当にありがとうございます。指摘通りで解決しました。 (1)の受信したデータの取り出しが上手くいったりいかなかったりしたのは、受信途中だったからですね。 (3)もretainCountが0だった時はnilでした。 (2)のデータはUTF-8で間違いなかったです。 なので、(1)が原因で、上手くいったり失敗したりが乱数的に発生したと思います。 --------------------------------------------------------------------------------------------- Objective-Cをはじめて1ヶ月で、手探りでプログラミングをしてる段階ですが、周りでObjective-Cの知識のある人が いないので、本当に助かりました。