- 2008-12-24 (水) 16:57
- iPhone SDK / Cocoa / Objective-C
iPhoneアプリ開発において、本来releaseするところでdeallocをすると当然ながら実行時にエラーが発生します。ただし、エラーが発生するのはdeallocした場所ではなく値を参照した場所となるので注意が必要です。
以下は今回体験したdeallocとreleaseの間違えでエラーが発生してから原因にたどり着くまでの流れです。
次のようなコードを実行したところでエラーが発生しました。
NSMutableArray* anArray = [NSMutableArray arrayWithCapacity: 10]; MyObject* obj = [[MyObject alloc] init]; [anArray addObject:obj];[obj dealloc];//本来はrelease
id lastObj = [anArray lastObject];
if([lastObj isMemberOf:[MyObject class]]) {//ここでエラー
// 以下略
そしてデバッグコンソールには次のようにエラーが表示されいました。
Unable to disassemble .objc_class_name_ NSKey Value Undefined Setter.
分かりにくいエラーメッセージです。ここでエラーが出た行にブレークポイントをおいて変数を見てみるとlastObjectがNSCFTypeという型を持っていることが分かりました。そこでNSCFTypeを検索するとNSCFTypeと関わるエラーメッセージについてを発見しました。このエントリには次のようにあります
要するに、メモリ管理が間違っていて使おうとしているインスタンスなどが既に解放された場合にこの「NSCFType」というものが出現するらしい。
とメモリ管理周りの不具合であることがわかりました。そしてようやくreleaseであるべき場所がdeallocになっていることに気がついたのでした。
関連する投稿
- Newer: idleTimerDisabled = NO でもスリープしない
- Older: NSUndoManagerをiPhoneOSで使いたい
Comments:0
Trackbacks:0
- Trackback URL for this entry
- http://iphone-dev.ensites.net/archives/492/trackback
- Listed below are links to weblogs that reference
- releaseすべきところでdeallocをすると from iPhoneアプリ開発ブログ