2016-07-31 4 views
1

Objective-Cで書かれたアプリがあり、数字のUITableを表示する必要があります。数字のリストは、情報が.plistファイルから取られたNSMutableArrayから取られます。通常、すべて正常です。NSMutableArrayからアイテムを削除するときにアプリケーションがクラッシュするが、特定の条件が満たされた場合のみ

ただし、このアプリには特定の方法で番号を整理するための設定が含まれています。デフォルトの設定では、アルファベット順に整理されます。次はデフォルトとは逆にそれらを編成します。これらの2つの設定は問題ありません。この問題は、奇数と偶数を分割してテーブルを構成する設定を選択したときに発生します。これは、それらを分割するコードである。この後

for (int i = 0; i < [tempGeneralSorterArray count]; i++) 
{ 
    NSString *tempHouseNumber = [[tempGeneralSorterArray objectAtIndex:i] stringByTrimmingCharactersInSet:letters]; 
    int tempHouseNumberValue = [tempHouseNumber intValue]; 

    if (tempHouseNumberValue % 2 == 0) //% is the modulo operator, shows what's left after a division 
    { 
     //even 
     [tempEvenSorterArray addObject:[tempGeneralSorterArray objectAtIndex:i]]; 
     [tempEvenSorterArray sortUsingSelector:@selector(compare:)]; 
    } 
    else 
    { 
     //odd 
     [tempOddSorterArray addObject:[tempGeneralSorterArray objectAtIndex:i]]; 
     [tempOddSorterArray sortUsingSelector:@selector(compare:)]; 
    } 
} 

、アプリが選択された設定に応じて異なる方法で二つの配列(tempOddSorterArrayとtempEvenSorterArray)を組み合わせ、このような一般的に:

customerArray = [tempOddSorterArray arrayByAddingObjectsFromArray:tempEvenSorterArray]; 

テーブルはほとんど表示されますが、セルを削除しようとするとエラーが発生します。

[customerArray removeObjectAtIndex:indexPath.row]; 

私は、デバッガでこれを取得する:それは、このラインでクラッシュ

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSArrayI removeObjectAtIndex:]: unrecognized selector sent to instance 0x7fae62410f30' 

任意の助けをいただければ幸いです、そして必要であれば、私は喜んでより多くの情報またはコードを与えるでしょう。

また、ここで使用されるすべての配列はNSMutableArraysです。

+2

_Also、ここで使用されるすべてのアレイがあるNSMutableArrays._これを:これは、あなたがそれを行うことができる方法であります偽です。例外から分かるように、少なくとも1つは不変です: '__ NSArrayI'。 – Avi

+0

@Avi NSMutableArraysとして私の使用している配列(customerArray、tempEvenSorterArray、tempOddSorterArray)をすべて.hファイルに宣言しました...後で何か問題があった場合、通常のものに変更することは可能ですか? – JustMe

+2

変数の宣言された型は、それがあなたが考えるものだけをコンパイラに伝えます。これは実際に型が何であるかにほとんど影響を与えません。これはオブジェクトにとってさらに真実であり、 'NSArray'や親戚のようなクラスクラスターやサブクラスではさらに真実です。 – Avi

答えて

2

customerArrayは可変長として宣言されていますが、[tempOddSorterArray arrayByAddingObjectsFromArray:tempEvenSorterArray]は不変の配列を返します。 [[tempOddSorterArray arrayByAddingObjectsFromArray:tempEvenSorterArray] mutableCopy]のように修正してください。もしそれが壊れているなら教えてください。 :)

+0

実際に働いて、ありがとう!関係のない別の問題を見つけて訂正するのを手伝ってくれた@aviにもお世話になりました。皆さんから多くのことを学びました。しかし、なぜ私はそれが不変の配列を可変なものから戻しているのか分かりません。起こる可能性のある理由はありますか? – JustMe

+1

ようこそ:)。 "arrayByAddingObjectsFromArray"それが呼び出された配列は変更されませんが、新しい配列が返されます。メソッド名自体も、2つの配列を追加することで新しい配列(可変配列ではない)を返します。 –

+0

ああ、そうだ。私はそれがちょうどそれを変更すると思った、私はそれが完全にそれを置き換えるとは思わなかった。私のためにそれをクリアしてくれてありがとう。 – JustMe

-1

は、だから、

customerArray = [tempOddSorterArray arrayByAddingObjectsFromArray:tempEvenSorterArray]; 

が新しいNSArrayのインスタンスではなく、NSMutableArrayのインスタンスを返すことが判明しました。これに対して、NSMutableArray型のインスタンスを呼び出すには、NSMutableArray型のインスタンスが必要です。 これを実現するには、NSArrayを受け取った後にmutableCopyメソッドを呼び出します。

customerArray = [[tempOddSorterArray arrayByAddingObjectsFromArray:tempEvenSorterArray] mutableCopy]; 

[customerArray removeObjectAtIndex:indexPath.row]; 

あなたはまた、次のことを試みることができる、@Droppyはそれがより効率的なアプローチであることを主張するように、

NSMutableArray * customerArray; 
[customerArray addObjectsFromArray: tempEvenSorterArray]; 
+0

'[NSMutableArray addObjectsFromArray:]'を使うとより効率的です。 – Droppy

+0

@Droppy:大丈夫ですが、あなたの知識のために、addObjectsFromArray:はクラスメソッドではありません。これはインスタンスメソッドです。したがって、このようにする必要があります:NSMutableArray * customerArray; [customArray addObjectsFromArray:tempEvenSorterArray]; –

関連する問題