iOS错误::索引1超越界限

在我的应用程序中,我尝试从一个url加载内容,将它们存储在一个可变数组中,并将它们显示在一个表格视图中。 但是我无法正常工作,因为每次运行应用程序时都会出现以下错误:

*** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayI objectAtIndex:]: index 1 beyond bounds [0 .. 0]' *** First throw call stack: (0x34dd088f 0x36d9e259 0x34d2823d 0x316e562f 0x315f09a9 0x313c0c5d 0x313c1b95 0x313c1ae7 0x313c16c3 0xa5cfb 0x33623ec7 0x35387a09 0x35390051 0x33622965 0xa4dc1 0x313a8e33 0x313cd629 0x31391d7d 0x314544dd 0x3139a55d 0x3139a579 0x3139a40b 0x3139a3e7 0x313a8015 0x313a1985 0x3136fc6b 0x3136f70f 0x3136f0e3 0x3439222b 0x34da4523 0x34da44c5 0x34da3313 0x34d264a5 0x34d2636d 0x313a0a13 0x3139de7d 0xa4745 0xa46dc) terminate called throwing an exception 

我创build的数组应该填充我的viewDidLoad中的表:

 _videos = [[NSMutableArray alloc] init]; 

然后我连接到url,并通过收到的XML数据parsing。 这工作就像它应该。 当打开某个标签时,我创build了我的video对象,在填充数据后,将这些对象添加到我的数组中:

 [_videos addObject:currentVideo]; 

这似乎也适用,因为它返回正确数量的video时

 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return _videos.count; } 

叫做。 但在此之后,应用程序崩溃,我甚至没有达到我试图填充我的表视图。 该函数如下所示:

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { Video *curVideo = [_videos objectAtIndex:indexPath.row]; static NSString *CellIdentifier = @"CustomCell"; CustomCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) cell = [[CustomCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier]; cell.titleLabel.text = [curVideo title]; cell.descLabel.text = [curVideo desc]; return cell; } 

什么做错了?

提前致谢

在初始化之前,您可能会访问_videosinit之后,在加载视图之前,很可能会这样做。 这种问题的解决方法是专门使用访问器,并懒惰地初始化self.videos 。 这是除了initdealloc之外不能直接访问你的ivars的许多原因之一。

 @interface ... @property (nonatomic, readonly, strong) NSMutableArray *videos; @end @implementation ... { NSMutableArray *_videos; // Can't auto-synthesize. We override the only accessor. } - (NSMutableArray *)videos { if (! _videos) { _videos = [NSMutableArray new]; } return _videos; } 

现在,所有对self.videos引用都将被初始化,而不pipe它们何时发生。

您还可以在init正确初始化video,这需要less一些代码:

 @interface ... @property (nonatomic, readonly, strong) NSMutableArray *videos; @end @implementation ... - (id)init { self = [super init]; if (self) { _videos = [NSMutableArray new]; } return self; } 

当试图用两个(从五个更新的)静态表格单元部分呈现模态故事板,表视图时,我有相同的错误签名-[__NSArrayI objectAtIndex:]: index 4 beyond bounds [0 .. 1]' 。 直到我删除了视图中不再需要的三个表格单元部分时,才出现此错误。 在检查了两天之前在模态表示之前的所有的objectAtIndex引用之后,我决定查看UITableViewController子类代码本身。 我find了这个:

 - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { //#warning Potentially incomplete method implementation. // Return the number of sections. return 5; } 

然后电灯泡熄灭了。 index 4涉及到我的表格视图的段数和[0 .. 1]的边界是指我当前的两个表格单元格部分。 更新return值以匹配故事板表视图中当前表格单元部分的数量解决了问题。

我已经通过像这样的图像数组的虚拟图像名称,

 arrImages = [NSArray arrayWithObjects:[UIImage imageNamed:@"some.png"] 

上面的行导致我错误。 所以我改变了@“some.png”,像@“category.png”这样的已经存在的图像。

这对我有效。 确保您传递的是正确的图像名称。