- ベストアンサー
テーブルビューで配列が自動消滅することについて
- テーブルビューで配列が自動消滅してしまう問題について質問です。xcode4.1を使用してiPhoneアプリを開発しています。画面遷移時に可変配列NSMutableArrayにplistを読み込ませたNSMutableDictionaryの一意のキーの中身を保存しようとしていますが、選択した行番号で呼び出した配列の中身を別のビューに渡すことができません。[[[NSMutableArray alloc] init] retain]としてもうまくいきませんでした。どうすればデータを正しく別のビューに渡すことができるでしょうか。
- テーブルビューで配列が自動消滅してしまう問題について質問です。xcode4.1を使用してiPhoneアプリを開発しています。画面遷移時に可変配列NSMutableArrayにplistを読み込ませたNSMutableDictionaryの一意のキーの中身を保存しようとしていますが、選択した行番号で呼び出した配列の中身を別のビューに渡すことができません。[[[NSMutableArray alloc] init] retain]としてもうまくいきませんでした。うまくデータを別ビューに渡す方法を教えてください。
- テーブルビューで配列が自動消滅してしまう問題について質問です。xcode4.1を使用してiPhoneアプリを開発しています。画面遷移時に可変配列NSMutableArrayにplistを読み込ませたNSMutableDictionaryの一意のキーの中身を保存しようとしていますが、選択した行番号で呼び出した配列の中身を別のビューに渡すことができません。データが自動解放されてしまっているようです。どうすればデータを正しく別のビューに渡すことができるでしょうか。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
こういうことを言われるのは、おそらくあなたにとって心外なことだとは思いますが、提示なさったコードを読ませていただく限りで判断すると、Objective-Cの基礎がまったくできていません。アドバイス差し上げようとするなら、それこそ入門のところから始めなければならず、とてもテーブルの表示というところまでたどりつけないでしょう。 > ary = [[[NSMutableArray alloc] init] retain]; > dic = [[[NSMutableDictionary alloc] init] retain]; インスタンスを、「alloc」、「init」メソッドで生成、初期化すると、Retain Countが1付与されます。ですから「retain」メソッドでカウントを増やす必要はありませんし、逆にインスタンスが自動開放されるのを妨げるので、メモリリークの原因になります。 > ary = [dic objectForKey:rcvStr]; こちらのほうは、retainしないと、スコープ(直近の{から}の範囲)から出ると、自動開放されてしまいます。「ary」はスコープ内で生成、初期化(さらにretain)しているから、開放されないだろうとお考えでしょうが、変数「ary」は、ポインタのアドレス値であることをお忘れなく。既存の変数に代入を行えば、異なる値になりますが、それは代入後べつのオブジェクトを参照するようになることです。 ary = [[[NSMutableArray alloc] init] retain]; NSLog(Address = %p", ary); ary = [dic objectForKey:rcvStr]; NSLog(Address = %p", ary); このようにコンソールにアドレス値を出力して、値が異なること、すなわち異なるオブジェクト(インスタンス)であることを確認してください。 ※iOS 5より、「ARC(Automatic Reference Counting)」という機能が加わり、retain、release、autoreleaseを記述する必要がなくなりました。コンパイラがオブジェクトの参照を監視して、適切に開放してくれるようになります。なので、これからARC対応の入門書が出てきたら、それで勉強して、オブジェクトの管理に関する勉強は、深くしないほうがいいかもしれません。 > id path = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"xxxxxxxx.plist"]; プロパティリスト(初期設定ファイル)の読み書きには、「NSUserDefaults」クラスを使ってください。 NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; この1行だけで、プロパティリストにアクセスできます。
お礼
まったく心外ではございません・・ご指摘の通りです。 ぜひ基礎からやりなおしたく思います。 実際にご指摘の通り改変しましたが、 テーブルビューのviewDidLoadの挙動?がわかっていないため、 最終的にretainCountが跳ね上がりました。。(質問ではありません。 またNSUserDefaultsクラスにつきましても ファイルにアクセスし読めれば良いと思いスルーしておりました・・。 大変分かりやすい解説をいただき本当にありがとうございました。