我声明并合成了一个可变数组属性:
@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 集合访问器中的数组时,为什么应用程序会在第一种情况下崩溃?
感谢您的任何投入,
拉吉