NSArray代码未运行

时间:2013-05-22 15:23:19

标签: ios objective-c arrays

我无法弄明白这一点,希望有人可以提供帮助。

这是我的ViewController.h文件中的代码。

{
NSArray *bgImages;
int currentBackground;
bool hasShrunk;
bool hasMoved;

CGAffineTransform translate;
CGAffineTransform sizeShrink;
CGAffineTransform sizeGrow;
}

以下是我在ViewController.m文件中的一些代码。

- (void)viewDidLoad {
hasMoved = NO;
hasShrunk = NO;
currentBackground = 0;

bgImages = [[NSArray alloc] initWithObjects:
        [UIImage imageNamed:@"WallPaper_01.png"],
        [UIImage imageNamed:@"WallPaper_02.png"],
        [UIImage imageNamed:@"WallPaper_03.png"],
        [UIImage imageNamed:@"WallPaper_04.png"],
        [UIImage imageNamed:@"WallPaper_05.png"],
        nil];

sizeShrink = CGAffineTransformMakeScale(.25,.25);
sizeGrow = CGAffineTransformMakeScale(1,1);

_myBackground.image = [bgImages objectAtIndex:currentBackground];
}

这是问题所在。这个代码和整个项目在模拟器上运行良好,没有问题。当我将输出更改为实际的iPhone设备时,它会失败。代码在分配名为bgImages的数组时失败。如果我在viewDidLoad上放置一个断点并逐行进入它,它会执行到数组分配行,然后跳过它。然后当它尝试执行该行时:

_myBackground.image = [bgImages objectAtIndex:currentBackground];

它将失败,因为数组为空。我不明白它如何在模拟器中工作,但不能在实际设备上工作。代码看起来不正确,但我最终试图理解为什么它的行为方式。我编码错了吗?

2 个答案:

答案 0 :(得分:4)

您遇到了问题,因为数组中没有任何元素。一种可能性是所有[UIImage imageNamed:...]次调用都返回nil。将其中一个作为单独的变量中断,例如

UIImage *firstImage = [UIImage imageNamed:@"WallPaper_01.png"];

并在该行上设置断点以确保正确初始化图像。如果不是,一个可能的原因是你有2x版本(WallPaper_01@2x.png)而不是1x版本,反之亦然。

编辑:正如@rdelmar所说,另一个可能的原因是,由于Mac OS X使用(默认情况下)不区分大小写的文件系统,但iOS使用区分大小写的文件系统,因此您正在使用错误的文件名,但你只是在iOS上看到一个问题,因为OS X并不关心文件名不完全正确。

答案 1 :(得分:0)

您似乎正在加载所有图像,然后只使用一个。这可能导致真实设备中的内存问题。您可能想要做的是这样的事情;

bgImages = [[NSArray alloc] initWithObjects:
            [@"WallPaper_01.png"],
            [@"WallPaper_02.png"],
            [@"WallPaper_03.png"],
            [@"WallPaper_04.png"],
            [@"WallPaper_05.png"],
                             nil];   
...
_myBackground.image = 
     [UIImage imageNamed:[bgImages objectAtIndex:currentBackground]];

另外,请查看@ rdelmar关于区分大小写的评论。