iphone - KVC Collection Accessor + index 0 beyond bounds for empty array 错误

标签 iphone ios cocoa-touch key-value-observing key-value-coding

我声明并合成了一个可变数组属性:

@property (nonatomic, strong) NSMutableArray *arrayOfTasks;

我正在使用 KVC collection Accessors对于相同的属性,我还有其他方法可以在内部调用此 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 集合访问器方法中包含以下内容:

-(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 条件返回 bool 值 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]];
    }
}

我可以继续使用这种有效且不会崩溃的方法,但我的担忧如下:

  1. 如果其他程序员想要从其他地方调用指定的方法,那么在指定的方法中添加相同的检查将是一个额外的优势。

  2. 当我不根据某些条件检查将对象插入到 KVC 集合访问器中的数组时,为什么应用会在第一种情况下崩溃?

感谢您的任何意见,

拉吉

最佳答案

我认为您看到的崩溃更可能与内部 KVC 行为有关,而不是与您的数组有关。这可能是您看不到可用堆栈跟踪的原因。你在 Xcode 中启用了异常断点吗?

KVC 基本上期望 -insertObject:in<Key>AtIndex:将在给定索引处插入一个新对象(在您的情况下可能为 0)。由于它假定对象已插入,现在应该可以通过在给定索引处为对象排队数据结构 (NSMutableArray) 来访问它。当条件演化为NO时,你插入这个对象失败,这意味着当KVO尝试使用提供的索引进行查询时,可能会出现索引越界异常。

您发布的第二个代码片段通过在不需要插入时不调用 KVC 集合访问器来避免此错误。

如果您想尽量减少有人错误使用这些方法的可能性,只需公开 -addObjectInArrayOfTasks:在你的公共(public)标题中。此外,您可以记录这一点。如果你想让它绝对确定 -insertObject:in<Key>AtIndex: int本身不能访问,可以加一个NSAssert , 检查该方法是否从 -addObjectInArrayOfTasks: 调用.

关于iphone - KVC Collection Accessor + index 0 beyond bounds for empty array 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13303626/

相关文章:

objective-c - 秒表的观察者模式

iphone - MKPinAnnotationView 上未显示 rightCalloutAccessoryView

objective-c - RestKit 动态嵌套映射

ios - webView中解析Json数据

iphone:如何像 NSCalendar 一样混合枚举

ios - 如何 Hook subview 的 subview ?

ios - iOS 9 是否支持 iPhone 进行多任务处理

ios - TableView 滚动错误

iphone - UITableView 未填充

iOS 强 vs 弱 UI 以编程方式创建