2

私は私のように定義されたデータソースであるNSMutableArray私の中にあります:ViewControllerUITableView

NSMutableArray *messageArray;

tableView データをリロードする方法がありますが、その前に、既存のテーブル データをクリアしたいと考えています。

次のコードを使用する場合:

  [messageArray removeAllObjects];    
  [self.tableView reloadData];

次の例外が発生します。

2013-02-12 14:20:30.378 appname[20998:907] * キャッチされていない例外 'NSInternalInconsistencyException' が原因でアプリを終了しています。 (0x3939e3e7 0x35dd6963 0x3939e307 0x393200e7 0x392eb5e5 0x7cda3 0x3a236047 0x3a2360d1 0x3a236047 0x3a235ffb 0x3a235fd5 0x3a23588b 0x3a235d79 0x3a15e5c9 0x3a14b8b1 0x3a14b1bf 0x336305f7 0x33630227 0x393733e7 0x3937338b 0x3937220f 0x392e523d 0x392e50c9 0x3362f33b 0x3a19f291 0x79c11 0x39be4b20) libc++abi.dylib: terminate called throwing an exception

しかし、次のコードを使用すると機能します。

  NSMutableArray *emptyArray = [NSMutableArray new];
  messageArray = emptyArray;    
  [self.tableView reloadData];

のエラーが発生するのはなぜremoveAllObjectsですか? これが犯人でしょうか?

    NSMutableDictionary *responseDictionary = [NSJSONSerialization JSONObjectWithData:responseData options:kNilOptions error:nil];
    messageArray = responseDictionary[@"data"];
4

6 に答える 6

5

これが犯人でしょうか?

NSMutableDictionary *responseDictionary = [NSJSONSerialization JSONObjectWithData:responseData options:kNilOptions error:nil];
messageArray = responseDictionary[@"data"];

はい、変更可能なコンテナーのオプションを使用します。

NSMutableDictionary *responseDictionary = [NSJSONSerialization JSONObjectWithData:responseData options: NSJSONReadingMutableContainers error:NULL];
于 2013-02-12T14:39:42.607 に答える
2

「NSMutableArray」は実際には NSMutableArray にキャストされた NSArray のようです。

次のようなコードを検索します。

messageArray = (NSMutableArray *)[obj methodReturningNSArray];

removeAllObjects「変更メソッドが不変オブジェクトに送信されました」というエラーが表示されるため、真の NSMutableArray でのみ機能します。

于 2013-02-12T14:27:33.663 に答える
1

この行を変更する必要があります:

messageArray = responseDictionary[@"data"];

に:

messageArray = [responseDictionary[@"data"] mutableCopy];

デフォルトでは、辞書から取得するオブジェクトは変更不可です

于 2013-02-12T14:33:02.977 に答える
0

データのmessageArrayリロードによって返されるのはNSMutableArrayではなく、代わりにNSArrayです。リロード後にデバッガーを停止すると、これを確認できます。.mutableCopy設定時に使用しますmessageArray

于 2013-02-12T14:29:44.220 に答える
0

エラーのある場所を見つける方法:

  1. という名前のプロパティを @synthesize するかどうかを確認しますmessageArray。このプロパティがNSArray型であるか、修飾子で宣言されている場合copy、合成されたセッターが原因です。
  2. そうでない場合は、 ivar を再宣言しNSMutableArray *const messageArrayます。これで、コンパイラは各割り当てを表示します。NSArray の割り当てを確認します。その後、宣言を元に戻すことを忘れないでください。
  3. 完了したら、ivar の名前を に変更して_messageArray、将来的に直接アクセスをより迅速に見つけられるようにします。
于 2013-02-12T14:34:23.220 に答える
0

どこかNSMutableArrayで のインスタンスに設定したかNSArray、タイプ のプロパティとしてNSMutableArray宣言しました。NSMutableArrayNSArray vs. NSMutableArray

Cocoaドキュメントでは、 read-only 、can't-be-changed-after-initialization objectsを指すためにimmutableこの単語を使用しています。

Cocoa / Objective-Cまた、命名規則に従う必要があります。つまり、クラス名は大文字で始まります。変数は myArray (またはもっとわかりやすいもの、できれば) の形式を取ります。

copyWithZone リファレンスNSMutableCopying プロトコル リファレンスの詳細を確認できます。

于 2013-02-12T14:34:56.343 に答える