2

配列から最後の2つの値を削除しようとしています。だから、私は以下のコードをやっていた-

-(void)connectionDidFinishLoading:(NSURLConnection *)connection
{

    NSString *resMsg = [[NSString alloc] initWithBytes: [webData mutableBytes] length:[webData length] encoding:NSUTF8StringEncoding];
    NSData *responseData = [resMsg dataUsingEncoding:NSUTF8StringEncoding];

    NSError *error = nil;

    if (responseData != nil) 
    {

        array = [NSJSONSerialization JSONObjectWithData:responseData options:0 error:&error];

        if([array count] == 2) {

        }else
        {
             int k = [self.array count] -2 ;
             int l = [self.array count] -1 ;

             [self.array removeObjectAtIndex:l];
             [self.array removeObjectAtIndex:k];

             [gridTable reloadData];
             [tblProducts reloadData];
         }

    }

}

しかし、以下の例外を与える-

キャッチされなかった例外'NSInternalInconsistencyException'が原因でアプリを終了しています、理由:'-[__ NSCFArray removeObjectAtIndex:]:変更メソッドが不変オブジェクトに送信されました'

なぜこれが起こったのか分かりませんか?私はすでにこのメソッドを別のviewControllerクラスでも使用しています。そこではうまく機能していました。しかし、ここでは例外があります。

4

1 に答える 1

1

から返されるオブジェクトは[NSJSONSerialization JSONObjectWithData:responseData options:0 error:&error];、autoreleased を返しNSArrayます。変更可能にしたい場合は、呼び出す必要がありますNSMutableArray *mutableArray = [array mutableCopy];

ここでの他のオプションは、options:パラメーターに 0 を入力する代わりに、 putNSJSONReadingMutableContainersです。これにより、余分なオブジェクトを作成せずに問題が解決します。

編集

新しい問題を解決するには:

NSMutableArray *newData = [NSJSONSerialization JSONObjectWithData:responseData options:NSJSONReadingMutableContainers error:&error];
//Here, modify the new array.  Remove your last two items. Then..
[newData addObjectsFromArray:array];
array = newData;

補足として、これにより、配列オブジェクトが予想とは異なる順序になる可能性があります。これを呼び出すことを選択できます...

NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"key" ascending:YES];
array = [newData sortedArrayUsingDescriptors:[NSArray arrayWithObject:sort]];
于 2012-11-08T14:14:14.273 に答える