2011-08-14 54 views
2

我有幾個ivar NSArrays,我在我的-viewDidLoad方法中初始化。一個包含字符串,一個包含IBOutlets。但是,當我初始化時,數組中的所有對象都超出了範圍,並且內存地址是0x0(根據Xcode調試器)。但是,當我有一個本地NSArray具有相同的對象,它工作正常。初始化ivar NSString或NSDictionary都可以正常工作。可可觸摸NSArray初始化不能正常工作

代碼:

//.h file 
#import <UIKit/UIKit.h> 
@interface myViewController : UIViewController 
{ 
NSArray *myArray; 
} 
@end 

//.m file 
#import "myViewController.h" 
@implementation myViewController 
- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    myArray = [[NSArray alloc] initWithObjects:@"aString", @"another string", nil]; 
    NSLog(@"myArray equals: %@.", myArray); 
} 
@end 

當我嘗試使用數組,我得到一個EXC_BAD_ACCESS運行時錯誤。這是一個Xcode錯誤,還是我缺少關於NSArray的東西?更新:我正在使用ARC。在關閉ARC並做一個乾淨的構建之後,我不再遇到這個問題。這是ARC的錯誤嗎?

我不知道是什麼問題,但我切換到穩定版本的Xcode(4.0.2),我根本沒有問題。感謝大家試圖幫助!

回答

2

當你問這樣一個問題時,你使用ARC是很重要的。

你如何使用數組(顯示代碼)?在ARC的某些版本中存在一個已知的錯誤(無法在iOS端進行討論,但同樣的錯誤發生在ARC的Lion版本中),在ARC下快速枚舉集合可能導致崩潰。

+0

目前,我只是試圖NSLog它。代碼是'NSLog(@「%@」,myArray);' – futurevilla216

+0

你可以發佈一個最簡單的例子嗎? – bbum

+0

好的,我會更新原文。 – futurevilla216

0

聽起來像框架還沒有實例化IBOutlet實例。你可以拖延並填充viewWillAppear方法中的數組嗎?這將在用戶看到任何東西之前調用。否則,將它們從IB中拉出來,只需手動管理它們並在任何你想要的地方進行分配。

+0

我不認爲這是IBOutlet的問題,因爲當我只有NSString的數組時,我得到同樣的問題。 – futurevilla216

0

你的示例代碼似乎是分配一個新的(和本地)版本的myArray,而不是設置你在頭文件中聲明的iVar。嘗試改變:

NSArray *myArray = [[NSArray alloc] initWithObjects:@"aString", @"another string", nil]; 

myArray = [[NSArray alloc] initWithObjects:@"aString", @"another string", nil]; 

弧的時候,我會假設你做任何企圖訪問myArray的什麼都不做,因爲它會被設置成零,而忽略所有消息。我不確定爲什麼這個代碼在啓用ARC的時候會有不同的工作方式。

+0

是的,這就是我所做的,我只是犯了一個錯字。抱歉! 使用ARC時,它根本不起作用。隨着ARC關閉,它工作正常。 – futurevilla216