使用转换的NSNumber到NSString返回EXC_BAD_ACCESS

时间:2012-04-26 15:22:25

标签: iphone objective-c nsstring nsnumber

我构建了一个“深度”NSMutableDictionary,它包含已解析的XML数据以及我可以从一个视图控制器传递到另一个视图控制器的其他相关信息。 NSMutableDictionary主要包含NSStrings,但也包含另一个NSMutableDictionary NSStrings,最后更深入地使用了一个自定义对象的NSMutableArray(它用于日历)。

现在,因为它是一个日历,所以显然涉及日期。我使用NSXMLParser接收和解析的XML数据返回字符串,因此我可以将当​​天的日期转换为可用的数字。 XML中的日期采用以下格式:“MM.DD”我创建了以下方法:

- (void)createDateCodesWithString:(NSString *)string 
{ 
   NSInteger monthCode;
   NSInteger dayCode;
   ....
   NSArray *dates = [string componentsSeparatedByString:@"."];
   monthCode = [[dates objectAtIndex:0] integerValue];
   dayCode = [[dates objectAtIndex:1] integerValue];
   ....
   shortDay = [NSNumber numberWithInt:dayCode];
}

'shortDay'是一个NSNumber *和一个ivar,并设置为我创建的自定义对象的属性(非原子,保留)。当我在控制台中运行NSLog命令时,似乎“shortDay”和其他数据已成功存储在深度NSMutableDictionary中。但是,当我尝试再次访问数据时,我遇到了问题。当我访问NSString *存储的ivar时,一切正常,但是当我尝试访问NSNumber *时,我得到错误EXC_BAD_ACCESS,代码为1或代码2.这就是我尝试调用NSNumber *

   NSNumber *number = day.shortDay;
   return [number stringValue];

问题可能是因为NSArray *日期将字符串剥离为月和日字符串,而日字符串(长度为两个字符)可能包含一个'0',例如,如果该日是第六个,则为'6'这个月?有什么建议?

如果需要,我很乐意发布更多代码。

1 个答案:

答案 0 :(得分:1)

在您下次尝试访问shortDay时,可能会清除shortDay = [[NSNumber numberWithInt:dayCode] retain]; 的内存。分配时,请尝试以下方法:

[shortDay release]

增加引用计数(AKA获取对象的所有权)以避免过早释放内存。

如果这样可以解决问题,那么您需要在班级的dealloc方法中调用{{1}},以便在适当的时间正确释放其内存。