【问题标题】:NSMutablearray unexpected behavior: all objects equal to last object addedNSMutablearray 意外行为:所有对象等于添加的最后一个对象
【发布时间】:2011-07-13 14:44:50
【问题描述】:

将对象添加到 NSMutablearray 时,我遇到了意外行为。基本上,我想在数组的末尾添加一个对象。数组中的所有对象都应该不同。但我看到的是数组中的所有对象都等于插入的最后一个对象。我已经包含了相关代码:

   _trafficArray = [[NSMutableArray alloc] init];


    int _index = -1;
    int _currentIndex = 0;
    int _reportCount = 0;

TrafficReport *_report = [[TrafficReport alloc] init];


    while (true) {

        if (!xmlTextReaderRead(_reader)) break;

        switch (xmlTextReaderNodeType(_reader)) {     

            case XML_READER_TYPE_ELEMENT:


                temp = (char *)xmlTextReaderConstName(_reader);

                currentTagName = [NSString  stringWithCString:temp encoding: NSUTF8StringEncoding];

                if([currentTagName isEqualToString:@"Title"])
                {

                    _index++;

                    temp = (char *)xmlTextReaderConstName(_reader);

                    currentTagName = [NSString  stringWithCString:temp encoding: NSUTF8StringEncoding];


                    xmlTextReaderRead(_reader);

                    temp = (char*)xmlTextReaderConstValue(_reader);
                    currentTagValue = [NSString stringWithCString:temp 
                                                         encoding:NSUTF8StringEncoding];


                    _report.title = currentTagValue;

                    _reportCount++;


                }
                if ([currentTagName isEqualToString:@"Description"]) {

                    temp = (char *)xmlTextReaderConstName(_reader);

                    currentTagName = [NSString  stringWithCString:temp encoding: NSUTF8StringEncoding];

                    xmlTextReaderRead(_reader);

                    temp = (char*)xmlTextReaderConstValue(_reader);
                    currentTagValue = [NSString stringWithCString:temp 
                                                         encoding:NSUTF8StringEncoding];

                    _report.description = currentTagValue;
                    _reportCount++;


                }

            if (_reportCount==2) {


                _reportCount = 0;

                NSLog(@"updated! with index = %d and title = %@\n\n", _index, _report.title);



                [_trafficArray insertObject:_report atIndex:_index];

                [_report release];

    TrafficReport *_report = [[TrafficReport alloc] init];


            }


            continue;

        default:continue;
    }


}

【问题讨论】:

    标签: iphone objective-c ios nsmutablearray


    【解决方案1】:

    这是范围问题。释放_report 后,您在if 语句的范围内声明了一个新的_report 对象。尽管它与您在 while 循环之前声明的名称相同,但它引用了不同的变量。删除赋值前的声明 (TrafficReport *) 以将新值赋给现有的 _report 变量。

    【讨论】:

    • 这是正确的答案。我错过了if 语句中的分配,@omz 完全正确,您声明了一个新变量_report,它(简要地)隐藏但不会替换第一个变量。另外,请确保最后一个 TrafficReport 实例已正确释放 - 现在我认为您正在泄漏一个对象。
    • 谢谢,这成功了。我对 ios 和目标 c 相对较新,所以这类问题可能会让我头疼。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-03
    • 1970-01-01
    • 2011-11-09
    相关资源
    最近更新 更多