2013-05-22 145 views
1

我無法弄清楚這一點,希望有人能幫忙。NSArray代碼沒有運行

這是我的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

什麼是確切的錯誤? _myBackground是否已初始化?另外,NSarray是一個錯字,應該是NSArray。 –

+1

你的代碼是否實際上用小寫「a」表示「NSarray」?這可能是一個問題。 – bdesham

+0

對不起。當我在此網站上輸入代碼時,這是一個錯字。我得到的錯誤是這樣的... ***終止應用程序由於未捕獲的異常'NSRangeException',原因*** - [__ NSArrayI objectAtIndex:]:索引0超出空數組的界限' – Doug

回答

4

你遇到了問題,因爲數組中沒有任何元素。一種可能性是所有[UIImage imageNamed:...]調用返回nil。將其中的一個作爲單獨的變量排除,例如

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

並在該行上設置斷點以確保圖像正確初始化。如果不是,則可能的原因是您有2x版本([email protected]),但不是1x版本,反之亦然。

編輯:作爲@rdelmar指出,另一個可能的原因是,因爲Mac OS X中使用(默認)不區分大小寫的文件系統,但是iOS版採用的是大小寫敏感的文件系統,你使用了錯誤的文件名,但你只在iOS上看到一個問題,因爲OS X並不關心文件名不完全正確。

+0

您可以嘗試不使用圖像擴展名[UIImage imageNamed:@「WallPaper_01」] – Alex

+0

這就是問題所在。圖像文件名的大小寫不正確。我不相信我花了幾個小時看着這個,我覺得自己像一個白癡!謝謝你幫助我增加我的知識。 – Doug

+0

是的,我已經被圖像文件名的大小寫了。謝天謝地,我立即認出了這個綜合徵,並且知道該去哪裏尋找。 –

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關於區分大小寫的評論。

+0

謝謝。在文件中還有其他代碼遍歷數組,並在按下按鈕更改背景圖片時遞增計數器。爲了清楚起見,我不想發佈整個文件。感謝您的評論。 – Doug