宣言および合成された可変配列プロパティがあります。
@property (nonatomic, strong) NSMutableArray *arrayOfTasks;
同じプロパティにKVCコレクション アクセサーを使用しています。また、この KVC コレクション アクセサー メソッドを次のように内部的に呼び出す他のメソッドもあります。
-(void)insertObject:(CSTaskAbstract *)inTask inArrayOfTasksAtIndex:(NSUInteger)index
{
[[self arrayOfTasks] insertObject:inTask
atIndex:index];
}
-(void)addObjectInArrayOfTasks:(CSTaskAbstract *)inTask
{
[self insertObject:inTask
inArrayOfTasksAtIndex:[[self arrayOfTasks] count]];
}
いくつかの変更を行い、特定の条件が満たされた場合にのみオブジェクトを配列に追加する必要があったため、このチェックが指定されたメソッドに確実に適用されるように、-insertObject KVC Collection アクセサー メソッドに以下を含めました。
-(void)insertObject:(CSTaskAbstract *)inTask inArrayOfTasksAtIndex:(NSUInteger)index
{
if ([inTask isOperatable])
{
[[self arrayOfTasks] insertObject:inTask
atIndex:index];
}
}
-(void)addObjectInArrayOfTasks:(CSTaskAbstract *)inTask
{
[self insertObject:inTask
inArrayOfTasksAtIndex:[[self arrayOfTasks] count]];
}
-addObjectINArrayOfTasks
メソッドをトリガーするたびに、-isOperatable
条件がブール値の NO を返すと、スタック トレースがまったくない状態でアプリがクラッシュします。(スタック トレースはアプリケーションの main() にあります)。それが言うのは、「空の配列エラーの範囲を超えたインデックス0」です。
この理由を理解していません。まだ配列にアクセスしようとしていないため、フレームワークがインデックス 0 に要素がないと不平を言う機会を与えていません。さらに、配列項目のカウントを行っています。配列からオブジェクトにアクセスする前に、どこでもチェックしてください。境界外のインデックスにアクセスして要素にアクセスしようとすると、同じ時点でアプリがクラッシュし、境界外のインデックスにアクセスしようとした場所を正確に知らせてくれます。それは単純で簡単な修正でした。
さて、相互検証のために、次のようにコードを少し変更しましたが、うまくいくようです。
-(void)insertObject:(CSTaskAbstract *)inTask inArrayOfTasksAtIndex:(NSUInteger)index
{
[[self arrayOfTasks] insertObject:inTask
atIndex:index];
}
-(void)addObjectInArrayOfTasks:(CSTaskAbstract *)inTask
{
if ([inTask isOperatable])
{
[self insertObject:inTask
inArrayOfTasksAtIndex:[[self arrayOfTasks] count]];
}
}
機能していてクラッシュしないこのアプローチを進めることができますが、私の懸念は次のとおりです。
指定されたメソッドに同じチェックを追加することは、将来、他のプログラマーが別の場所から指定されたメソッドを呼び出したい場合に、追加の利点になります。
条件チェックに基づいて KVC コレクション アクセサーの配列にオブジェクトを挿入しないと、最初のケースでアプリがクラッシュするのはなぜですか?
ご意見ありがとうございます。
ラージ