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 超出空数组的范围