【问题标题】:Objective C - NSArray and For loop structureObjective C - NSArray 和 For 循环结构
【发布时间】:2011-03-20 11:19:20
【问题描述】:

工作阻碍了学习 Objective C,但我现在又回来了,这让我发疯了。

这是我的代码:

i=0;
    for (i=0;[photoList count]; i++) {
        NSLog(@"%i",i);
        NSLog(@"%@",[photoList objectAtIndex:i]);
        NSString *fileName = [photoList objectAtIndex:i];
        sendImage = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:fileName ofType:nil]];
        UIImageWriteToSavedPhotosAlbum(sendImage,self,@selector(savedPhotoImage:didFinishSavingWithError:contextInfo:),NULL);}

photoList 只是一个像这样的 NSArray,除了有 24 个对象:

NSArray* photoList = [NSArray arrayWithObjects:@"Photo 1.jpg",
    @"Photo 2.jpg",
    @"Photo 3.jpg",
    @"Photo 4.jpg",nil];

它可以工作...它将照片复制到相机胶卷...然后崩溃

2010-07-24 19:34:36.116 iCardz2go Poindexter[29662:207] * 由于未捕获的异常“NSRangeException”而终止应用程序,原因:'* -[NSArray objectAtIndex:]: index 24 越界 [0 .. 23]'

我尝试了各种配置,例如

for (i=0;1<23; i++)

只为得到 2010-07-24 19:51:01.017 iCardz2go Poindexter[29908:207] *** 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“+ [NSInvocation invocationWithMethodSignature:]:方法签名参数不能为 nil”

所以它正在读取 nil 并传递它。

我知道这将是一件我已经忘记的非常简单的事情。为什么它不在照片 23(计数)处跳出循环?

非常感谢您的帮助! P

【问题讨论】:

  • 如果有24个对象,计数怎么可能是23?
  • 您应该学习 C 编程语言教程,因为它有望涵盖循环等结构。 Objective-C 是 C 之上的一个相当薄的层,因此熟悉 C 将有助于您也掌握 Objective-C。
  • Marcelos - 因为我认为 NSArray 从 0 开始计数...不是吗?
  • 有效索引的范围是 0 到 23,但计数仍然是 24。

标签: iphone objective-c for-loop nsarray


【解决方案1】:

为什么不试试快速枚举呢?

for (NSString *photoFile in photoList) {
  NSLog(@"%@", photoFile);
  sendImage = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] 
                               pathForResource:photoFile 
                                        ofType:nil]];

  UIImageWriteToSavedPhotosAlbum(sendImage, self, @selector(savedPhotoImage:didFinishSavingWithError:contextInfo:), NULL);}
}

【讨论】:

  • 谢谢!直到现在我才听说过快速枚举……要学的东西太多了。但是使用您的代码它在写入相机胶卷之前崩溃并出现相同的错误:由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“+ [NSInvocation invocationWithMethodSignature:]:方法签名参数不能为nil”
  • 也就是说循环(上面打印的代码中有一个错误实际上是 i
【解决方案2】:

for 循环条件 — [photoList count]1&lt;23 — 始终计算为 true。试试i &lt; [photoList count]。更好的是,使用@Eimantas 的答案。

【讨论】:

  • 非常感谢...这是我
  • 使用 i
【解决方案3】:

C 和 Objective-C 中的 For 循环如下所示:

for (initialization; condition; increment) {
    // body
}

initialization 是你设置循环的地方;这是你告诉它从什么开始的地方。 condition 为每次迭代进行测试,包括第一次;如果condition 计算结果为真,则执行循环体。在每次迭代结束时,都会评估 increment

所以:

for (int i = 0; i < 10; i++) {
    printf("%i\n", i);
}

将打印数字 0 到 9。您可能想要的是:

NSUInteger count = [photoList count];
for (NSUInteger i = 0; i < count; i++) {
    NSString *fileName = [photoList objectAtIndex: i];
    sendImage = [UIImage imageWithContentsOfFile: [[NSBundle mainBundle] pathForResource: fileName ofType: nil]];
    UIImageWriteToSavedPhotosAlbum(sendImage, self, @selector(savedPhotoImage:didFinishSavingWithError:contextInfo:), NULL);
}

注意循环外count的赋值;这只是一种优化,因此循环不必为每次迭代发送额外的消息(你可以很容易地做到i &lt; [photoList count]。)

这有帮助吗?

【讨论】:

  • 也谢谢你。仍然崩溃:由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:'+ [NSInvocation invocationWithMethodSignature:]:方法签名参数不能为nil'这让我发疯,因为我不知道如何解释错误消息。跨度>
  • 你的班级真的回复-savedPhotoImage:didFinishSavingWithError:contextInfo:了吗?您需要确保已实施。
  • 谢谢!这就是问题所在!我记得在几天前评论它测试......某物......而且很低,但它仍然被评论!!!!但是因为我是第一次玩 NSArray,并且通过将它放在一个循环中来获得真正的高级(LOL!),所以我自动认为问题就在那里。我和其他新手非常感谢您的帮助和上述帮助。通常我可以通过搜索找到答案,但这让我很难过。谢谢你们!希望有一天我能为人们做同样的事情。
【解决方案4】:

来自您的代码:

for (i=0;[photoList count]; i++)

条件[photoList count] 始终为真。 不过,我没有阅读整个讨论。

【讨论】:

    【解决方案5】:

    将 for 语句更改为 for(i=0; i

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-28
      • 2019-04-14
      • 2012-06-04
      相关资源
      最近更新 更多