1

这个我想不通,希望有人能帮忙。

这是我的 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];

它将失败,因为数组为空。我不明白这如何在模拟器中工作,但不能在实际设备上工作。代码看起来并不正确,但我不知道为什么它会以这种方式运行。我编码不正确吗?

4

2 回答 2

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 并不关心文件名是否完全正确。

于 2013-05-22T15:33:49.567 回答
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 关于区分大小写的评论。

于 2013-05-22T15:37:38.310 回答