NSArrayM 中的异常 insertObject:atindex
Posted
技术标签:
【中文标题】NSArrayM 中的异常 insertObject:atindex【英文标题】:exception in NSArrayM insertObject:atindex 【发布时间】:2015-06-04 05:04:24 【问题描述】:我在项目中使用了 4 张图片 .. 运行时结果:
* 由于未捕获的异常 'NSInvalidArgumentException' 导致应用程序终止,原因:'* -[__NSArrayM insertObject:atIndex:]: object cannot be nil' *** 首先抛出调用栈:
我的代码:
NSArray *imageNames= @[@"jake_2.png",@"jake_3.png",@"jake_4.png",@"jake_5.png "];
// Do any additional setup after loading the view, typically from a nib.
NSMutableArray *images = [[NSMutableArray alloc] init];
for (int i = 0; i < imageNames.count; i++)
[images addObject:[UIImage imageNamed:[imageNames objectAtIndex:i]]];
UIImageView *slowAnimationImageView = [[UIImageView alloc] initWithFrame:CGRectMake(160, 95, 86, 193)];
slowAnimationImageView.animationImages = images;
slowAnimationImageView.animationDuration = 5;
[self.view addSubview:slowAnimationImageView];
[slowAnimationImageView startAnimating];
【问题讨论】:
把代码放在代码括号里,现在很难看懂你的代码 阅读错误信息object cannot be nil
检查您的图像名称一次。您存储的图像不应为零。
【参考方案1】:
您遇到问题是因为您在数组中提供的 imageName 在资源中不可用。检查数组中的最后一个对象:@"jake_5.png"。里面有一个额外的空间。请删除它。这就是导致此问题的原因。
更新:
对于动画,您需要在将所有图像添加到 imageArray 后进行设置。请参阅此代码以获取帮助并进行更改:
NSMutableArray *images = [[NSMutableArray alloc] init];
for (int i = 0; i < imageNames.count; i++)
[images addObject:[UIImage imageNamed:[imageNames objectAtIndex:i]]];
slowAnimationImageView.animationImages = images;
slowAnimationImageView.animationDuration = 5;
[slowAnimationImageView startAnimating];
希望对你有帮助...
【讨论】:
我需要使用带有动画的按钮。帮我解决这个问题 是的,我需要动画【参考方案2】:最后一张图片名字的空格有小错误
NSArray *imageNames= @[@"jake_2.png",@"jake_3.png",@"jake_4.png",@"jake_5.png"];
// Do any additional setup after loading the view, typically from a nib.
NSMutableArray *images = [[NSMutableArray alloc] init];
for image in imagesNames
[images addObject:[image];
UIImageView *slowAnimationImageView = [[UIImageView alloc] initWithFrame:CGRectMake(160, 95, 86, 193)];
slowAnimationImageView.animationImages = images;
slowAnimationImageView.animationDuration = 5;
[self.view addSubview:slowAnimationImageView];
[slowAnimationImageView startAnimating];
但如果您不想像这样添加 for 循环,请使用方法 addObjectOfArray 将对象附加到可变数组中
【讨论】:
【参考方案3】:NSArray *imageNames= @[@"jake_2.png",@"jake_3.png",@"jake_4.png",@"jake_5.png "]; replace it with
NSArray *imageNames= @[@"jake_2.png",@"jake_3.png",@"jake_4.png",@"jake_5.png"];
因为你把空间@“jake_5.png”可能是这个图像在资源中不可用所以它会给你错误。
【讨论】:
不,在使用@[ ]
语法时,不要在末尾使用nil
。
如果使用 nil 则会给出错误:void 类型的集合元素不是目标 c 对象
你能检查资源中的图像名称吗? “jake_5.png”或“jake_5.png”的图像名称是什么,您还可以通过循环进行检查以您的图片姓氏。
我需要使用带动画的按钮。帮我解决这个问题【参考方案4】:
问题出现是因为@"jake_5.png "
多了一个空格:
NSArray *imageNames= @[@"jake_2.png",@"jake_3.png",@"jake_4.png",@"jake_5.png "];
应该是这样的:
@"jake_5.png"
附录:
您希望UIImageView
为一系列图像设置动画的方式不正确:
请将您的替换为以下内容:
UIImageView *slowAnimationImageView = [[UIImageView alloc] initWithFrame:CGRectMake(160, 95, 86, 193)];
[self.view addSubview:slowAnimationImageView];
NSArray *imageNames = @[@"jake_2.png", @"jake_3.png", @"jake_4.png", @"jake_5.png"];
NSMutableArray *images = [[NSMutableArray alloc] init];
for (int i = 0; i < imageNames.count; i++)
[images addObject:[UIImage imageNamed:[imageNames objectAtIndex:i]]];
slowAnimationImageView.animationImages = images;
slowAnimationImageView.animationDuration = 5;
[slowAnimationImageView startAnimating];
【讨论】:
不,在使用@[ ]
语法时,不要在末尾使用nil
。
@rmaddy 但是我的“旁注”也提到了空格,这会导致错误。这也表明他试图为图像制作动画的方式是错误的。他尝试动画的方式不会有任何图像动画,因为属性animationImages
在循环结束时将只保存一个图像。
修复所有在数组末尾使用nil
的引用,然后您将得到一个很好的答案。以上是关于NSArrayM 中的异常 insertObject:atindex的主要内容,如果未能解决你的问题,请参考以下文章
异常'NSRangeException',原因:'*** -[__NSArrayM objectAtIndex:]:索引 19 超出范围 [0 .. 18]'
由于未捕获的异常“NSRangeException”而终止应用程序。 [__NSArrayM objectAtIndex:]:索引 33 超出范围 [0 .. 32]'
调用“[super layoutSubviews]”会抛出“[__NSArrayM objectAtIndex:]: index 1 beyond bounds”异常
由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:'-[__NSArrayM itemName]:无法识别的选择器发送到实例
由于未捕获的异常“NSRangeException”而终止应用程序,原因:“*** -[__NSArrayM objectAtIndex:]:索引 0 超出空数组的范围”
由于未捕获的异常“NSRangeException”而终止应用程序,原因:-[__NSArrayM objectAtIndex:]:索引 0 超出空数组的范围