2011-02-17 31 views
0

我想從NSDictionary生成一個UIActionSheet。錯誤與NSDictionary

codeCountryMap是在.h文件中定義的NSDictionary變量。代碼編譯正確,但在運行時崩潰。但整個代碼在handleEvents方法中初始化完成時起作用

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    NSArray *codes = [NSArray arrayWithObjects:@"91", @"01", @"002", nil]; 
    NSArray *cName = [NSArray arrayWithObjects:@"ABC", @"QWE", @"XYZ", nil]; 
    codeCountryMap = [NSDictionary dictionaryWithObjects:codes forKeys:cName]; 
} 

-(IBAction) handleEvents:(id)sender 
{  
    UIActionSheet *displayCodeCountryMap = [[UIActionSheet alloc] initWithTitle:@"Select Country" delegate:self cancelButtonTitle:nil 
              destructiveButtonTitle:nil otherButtonTitles:nil,nil]; 

    for(id key in codeCountryMap) { 
     [displayCodeCountryMap addButtonWithTitle:(NSString *)key]; 
    } 

    [displayCodeCountryMap addButtonWithTitle:@"Cancel"]; 
    displayCodeCountryMap.cancelButtonIndex = [codeCountryMap count]; 
    displayCodeCountryMap.actionSheetStyle = UIActionSheetStyleBlackOpaque; 
    [displayCodeCountryMap showInView:self.view]; 
    [displayCodeCountryMap release]; 
    [country resignFirstResponder]; 
} 

當handleEvents:方法被調用時,應用程序崩潰。任何形式的幫助都會大受歡迎。

在此先感謝。

+0

你得到的錯誤是什麼?它會發生什麼? – 2011-02-17 15:19:39

+0

這是一個運行時錯誤..........在調用handleEvents方法時發生。我已經更新了這個問題 – devsri 2011-02-17 19:23:02

回答

2

這很可能是內存管理問題。看起來你將iVar codeCountryMap設置爲NSDictionary的一個自動釋放對象,而不是保留它(至少不在這個代碼片段中)。這意味着當'handleEvents'方法被調用時,NSDictionary項已經從內存中釋放。

嘗試保留NSDictionary項目,或者,如果codeCountryMap被定義爲保留屬性,則使用以下代碼進行設置。

self.codeContryMap = [NSDictionary dictionaryWithObjects:codes forKeys:cName]; 

這將使用合成方法來設置屬性並保留它。

0

otherButtonTitles參數中不需要2 nil的終止符。如果你通過了字符串,那麼它將不得不終止。既然你沒有,一個nil就足夠了。

UIActionSheet *displayCodeCountryMap = [[UIActionSheet alloc] initWithTitle:@"Select Country" delegate:self cancelButtonTitle:nil 
              destructiveButtonTitle:nil otherButtonTitles:nil];