2011-02-17 164 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];