如何解决iOS 64bit错误

时间:2014-03-27 14:27:41

标签: ios objective-c nsstring 64-bit

我有一个适用于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。

2 个答案:

答案 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对象本身