我无法弄明白这一点,希望有人可以提供帮助。
这是我的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];
它将失败,因为数组为空。我不明白它如何在模拟器中工作,但不能在实际设备上工作。代码看起来不正确,但我最终试图理解为什么它的行为方式。我编码错了吗?
答案 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关于区分大小写的评论。