みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

Objective-Cのメソッド、または文字列操作の実装について

今、iPhoneアプリを開発しているのですが
実機で実行するとSIGABRTを受け取ってアプリがクラッシュしてしまいます。
クラッシュログを解析すると、以下のようなコードでクラッシュしていることがわかりました。
-----
+(NSString*)methodSample
{
NSDate* aDate = [ NSDate date ];
NSString* aStr = [ aDate description ];
// クラッシュログで出てくるのは次のreturn文のところ
return [ aStr substringWithRange:NSMakeRange(5,5) ];
}
-----
このコードに何らかの不正な処理がありそうな気がするんですが、
このコードの問題点ってどこなのでしょうか。

どなたかわかる方がいらっしゃいましたら教えてください。

投稿日時 - 2009-11-19 12:45:56

QNo.5459869

困ってます

質問者が選んだベストアンサー

No.2です。

returnのタイミングでリリースされているのではなく、戻り値として取得ポインタを使用しようとしたタイミングでアボートとしているのだろうと思います。

私の環境で同じ関数を作成し、そのポインタをNSLogで使用しようとしたところ、NSLog中にエラーとなりました。

投稿日時 - 2009-11-21 16:26:11

お礼

回答ありがとうとざいます。
大変助かりました。

そんなことがあるんですね。
やっぱりCocoaは難しいです。

投稿日時 - 2009-11-24 20:03:45

ANo.3

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.2

それは文字列格納されているメモリー領域がリリースされてのこってないから。それにアクセスした時点でアボートになります。

[[aDate description]retain]などとしてメモリーがリリースされないよう明示しないといけないです。

その後自分で、使わなくなったらreleaseしなとメモリーリークになるんで気をつけてください。

投稿日時 - 2009-11-20 14:51:59

補足

回答有難うございます。
なるほど、と言った感じです。
aStrが自動開放されていると言う理解でいいですか?

ただ、よくわからない点があるのですが、
自動開放はイベントループごとにされているはずですが、
なぜreturnまでの間に自動開放されてしまうのでしょうか?

メソッド内でイベントループが終了するということはないと思うのですが・・・、
Cocoaは難しいです。

この辺のこともわかりますか?

投稿日時 - 2009-11-20 20:41:32

ANo.1

Objective-C も Cocoa も知らないので当てずッぽだけど, 「aStr の長さが足りない」とかいうオチはある?

投稿日時 - 2009-11-19 14:45:38

補足

回答ありがとうございます。
aStrには「YYYY-MM-DD HH:mm +msec」という形式で
日付が入っています。
なので長さは大丈夫そうです。

でも、aStrに何か問題ありって考えるのは自然ですね。
その方向でもっと調べてみます。

投稿日時 - 2009-11-20 13:29:43

あなたにオススメの質問