0

IET ANOTHER EDIT(奇妙さを増すため)コードの関連部分を表示するためにEDITED

やあ。私が理解していないNSMutableArrayには奇妙な問題があります...

説明:

プロパティ (非アトミック、保持) として定義され、合成され、29 個の要素で初期化された NSMutableArray があります。

realSectionNames = [[NSMutableArray alloc] initWithCapacity:29];

初期化後、必要に応じて要素を挿入でき、すべてが正常に機能しているようです。

ただし、アプリケーションの実行中に配列に新しい要素を挿入すると、要素を挿入した関数で配列を出力でき、すべて問題ないように見えます。

しかし、テーブル内の行を選択し、その配列を読み取る必要があると、アプリケーションがクラッシュします。実際、配列を印刷することさえできなくなりました。

NSMutableArray を使用するときに、私のような初心者が見逃している可能性がある、誰もが知っておくべき「魔法的で論理的なトリック」はありますか?

どうもありがとう。

配列を次のように宣言します

realSectionNames = [[NSMutableArray alloc] initWithCapacity:29];

配列にオブジェクトを挿入します

[realSectionNames addObject:[category categoryFirstLetter]];

私はそれを挿入することもできることを知っていますが

[realSectionNames insertObject:[category categoryFirstLetter] atIndex:i];

ここで、「i」は最初の空いている位置です。

挿入後、tableView のデータをリロードします。データをリロードする前または後に配列を印刷すると、必要な情報が含まれていることがわかります。

その後、テーブルで行を選択すると、アプリケーションがクラッシュします。この realSectionNames はいくつかの UITableViewDelegate 関数で使用されますが、その場合は問題になりません。本当に重要なことは、 didSelectRowAtIndexPath 関数の先頭で配列を出力すると、すべてがクラッシュすることです (もちろん、何も出力されません)。彼が動作する前に行を印刷するため、その行にあると確信しています(例):

NSLog(@"Anything");
NSLog(@"%@", realSectionNames);

出力を与えます:

2010-03-24 15:16:04.146 myApplicationExperience[3527:207] 何でも

[セッションは 2010-03-24 15:16:04 +0000 に開始。 Inc. GDB は、GNU General Public License の対象となるフリー ソフトウェアであり、特定の条件の下で変更および/またはコピーの配布を歓迎します。条件を表示するには、「showcopy」と入力します。GDB の保証は一切ありません。詳細については、「保証を表示」と入力してください。この GDB は "i386-apple-darwin".sharedlibrary apply-load-rules all プロセス 3527 にアタッチするように構成されました。

今回私がどんな愚かなことをしたのか、まだ理解できていません... 脳外科医のキャリアをたどるのに遅すぎることはないのでしょうか?

答えに続いて、私は印刷しました

NSLog(@"self=%x", self); 
NSLog(@"self=%@", self); 
NSLog(@"realSectionNames=%x", realSectionNames); 

すべての関数でまったく同じ結果が得られます (デリゲートからかどうかに関係なく)。

NSLog(@"realSections = %@", realSectionNames); 

私のviewWillAppear、didSelectRowAtIndexPathでうまく印刷され、viewForHeaderInSectionでクラッシュします。ちなみに、スレッドはありません...

だから、何をすべきかわからないまま、私は「もの」を試しています... realSectionNames のすべての参照を self.realSectionNames に変更しました

viewForHeaderInSection で印刷すると、次の問題が発生します。

2010-03-24 16:01:44.067 myApplication[4104:207] numberOfSectionsInTableView result -> 1
2010-03-24 16:01:44.068 myApplication[4104:207] viewForHeaderAtSection
2010-03-24 16:01:44.068 myApplication[4104:207] self=3d13470
2010-03-24 16:01:44.068 myApplication[4104:207] self=<RootViewController: 0x3d13470>
2010-03-24 16:01:44.069 myApplication[4104:207] self.realSectionNames=3b12830
2010-03-24 16:01:44.070 myApplication[4104:207] realSections = (
    <__NSArrayReverseEnumerator: 0x3b50500>
)
2010-03-24 16:01:44.070 myApplication[4104:207] *** -[__NSArrayReverseEnumerator length]: unrecognized selector sent to instance 0x3b50500
2010-03-24 16:01:44.071 myApplication[4104:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[__NSArrayReverseEnumerator length]: unrecognized selector sent to instance 0x3b50500'
2010-03-24 16:01:44.072 myApplication[4104:207] Stack: (
    31073371,
    2572170505,
    31455291,
    31024758,
    30877378,
    276908,
    26404,
    3227182,
    4544033,
    4551926,
    4550923,
    3267462,
    3207973,
    3249408,
    25927,
    3222086,
    3205252,
    459178,
    30857920,
    30854216,
    39163413,
    39163610,
    2949039
)

NSArrayReverseEnumerator とは??? そして、なぜそれは私にとって意地悪なのですか?

4

4 に答える 4

3

皆様へ(そして特に自分自身へのメモ)...

私は愚かな、愚かな少年です。

配列に挿入した要素を解放していました。

質問ばかりで申し訳ありません 回答ありがとうございます...

于 2010-03-24T16:46:28.307 に答える
1

アプリケーションがクラッシュすると、Xcode コンソールはアプリケーションのクラッシュの原因となったエラーを報告します。質問を編集して、関連するソース コードとともにこのエラー メッセージを含めると、他のユーザーが質問に回答するのに役立ちます。

選択したテーブルの行が、存在しない配列内のインデックスを指そうとしていると思われます。その場合、存在しない配列の一部を参照しようとしています。これにより、アプリケーションは例外をスローして終了します。

NSMutableArrayは特定の容量に初期化できますが、アイテムが挿入されるまで、実際にはオブジェクトを保持しないことに注意してください。この-initWithCapacity:メソッドは一定量のメモリのみを確保しますが、スルーインデックスのプレースホルダーやnilエントリはありません。1n

于 2010-03-24T14:44:25.367 に答える
0

1) エラーメッセージを教えてください。コードの関連部分は?

2) 配列を宣言する適切な方法は次のとおりです。

self.realSectionNames = [[NSMutableArray arrayWithCapacity:29];
于 2010-03-24T14:44:51.390 に答える
0

TableView のデリゲートが正しく接続されていないか、無効なオブジェクトに接続されていると思われます。他のデリゲート メソッドは機能していますか? これらを didSelectRowAtIndexPath の先頭に配置して、ポインター値を確認してください。

NSLog(@"self=%x", self);
NSLog(@"self=%@", self);
NSLog(@"realSectionNames=%x", realSectionNames);
于 2010-03-24T15:27:33.460 に答える