我有一个适用于32位平台的应用程序,但在64位设备和模拟器上运行时会抛出错误。有问题的代码是:
if ([lastStatus isEqualToString:@"0"]){ //EXC_BAD_ACCESS
bRetVal = YES;
}
来自我的课程文件:
@interface DPXmlHandler : NSObject <NSXMLParserDelegate> {
NSString *lastStatus;
NSString *msg;
NSMutableArray * locs;
NSMutableArray *alerts;
NSMutableArray *mrmMsgs;
}
@property (nonatomic, copy) NSString *lastStatus;
我在.m文件的顶部合成了lastStatus。我使用XML文件中的值填充字符串。 - (void)解析器:(NSXMLParser *)解析器 didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict {
if ([elementName isEqual:@"status"]) {
//Get attribute value
@try{
lastStatus = [attributeDict valueForKey:@"code"];
msg = [attributeDict valueForKey:@"message"];
}@catch (NSException *e){
NSLog(@"Exception: %@", e);
msg = e.name;
}
该值是一个整数,但我无法理解为什么我不能存储字符串“0”并将其与@“0”进行比较。我很感激有关如何改变这一点的任何见解。 lastStatus的值大约从-100到100.我可以将lastStatus设为int或long并使用==运算符,但我似乎无法找到有关WHY这是一个问题的任何指导。
我检查了Apple的guide on converting apps to 64 bit,但没有提到NSString。
答案 0 :(得分:1)
避免直接使用实例变量而是使用属性。
if ([elementName isEqual:@"status"]) {
//Get attribute value
@try{
self.lastStatus = [attributeDict valueForKey:@"code"];
self.msg = [attributeDict valueForKey:@"message"];
}@catch (NSException *e){
NSLog(@"Exception: %@", e);
self.msg = e.name;
}
因为你的代码没有保留或复制对象,所以它们是自动释放的。
答案 1 :(得分:0)
啊,当你说你可以创建lastStatus和int或long时,听起来像为密钥"code"
返回的值实际上是int或long类型,而不是NSString类型。 isEqualToString
是NSString类的函数,因此如果您尝试将它与int或long进行比较,它将不起作用。你可以通过@([attributeDict valueForKey:@"code"]).stringValue
注意:@()是NSNumber,@“”是NSString
修改强>
抱歉,你实际上不能在字典中存储整数或长片,因为它们需要NSObject才能存储,所以也许它们已经是NSNumbers,那么你可以使用.stringValue
对象本身