尝试访问数据时输出奇怪

时间:2010-08-15 15:12:33

标签: iphone exc-bad-access

我有一个数据结构对象,它是从委托的“did finish loading”方法中的XML文件加载的。

如果我从委托的load方法内部使用数据对象“printData”方法,则显示所有信息。我可以多次这样做。

但是,我有一个按钮在委托中运行第二个方法,所有这一切都是运行我的数据对象的printData方法,但我得到的只是一个或一些随机属性文本。

e.g。 “UIDeviceFamily”或“ar.lproj”等...

打印完成后,它会以“EXC_BAD_ACCESS”错误导致应用崩溃。

我记得有一个目录可以查找这个错误的更多细节,但我不记得它是哪一个。

感谢您提供的任何帮助。

抱歉,这是应用程序中重要的代码......

这是填充数据的代码。

    -(id)initMapFromXMLData:(NSData *)xmlData
{
    if (self = [super init])
    {
        MapXMLParser *parser = [[MapXMLParser alloc] initWithData:xmlData];
        [parser setDelegate:parser];
        [parser parse];

        statementPairs = [NSDictionary dictionaryWithDictionary:parser.statementPairs];
        prefPairs = [NSDictionary dictionaryWithDictionary:parser.prefPairs];
        clusters = [NSDictionary dictionaryWithDictionary:parser.clusters];

        /*
        statementPairs = parser.statementPairs;
        prefPairs = parser.prefPairs;
        clusters = parser.clusters;
        [parser release];*/
    }
    return self;
}

然后从委托中运行...

NSData *xmlData;

xmlData = [[NSData alloc] initWithContentsOfFile:@"/Users/oliver/Documents/XCode stuff/Saviio/Saviio 2/Saviio/Classes/Statements"];

myMap = [[Map alloc] initMapFromXMLData:xmlData];

然后在同一个委托方法中我显示它......

[myMap printClusters];

......运行......

-(void)printClusters
{
    NSLog(@"Printing Clusters for %@", self);

    for (int i = 1; i <= [clusters count]; i++)
    {
        Cluster *tempCluster;

        tempCluster = [clusters objectForKey:[NSString stringWithFormat:@"%d", i]];

        NSLog(@"Cluster %@", tempCluster.name);

        for (int j = 0 ; j < [tempCluster.fgids count]; j++)
        {
            Preference *tempPref;

            tempPref = [prefPairs objectForKey:[[tempCluster.fgids objectAtIndex:j] stringValue]];

            NSLog(@"Pref ---> %@/%@", tempPref.left, tempPref.right);

            for (int k = 0 ; k < [tempPref.qids count]; k++)
            {
                Statement *tempStat;

                tempStat = [statementPairs objectForKey:[[tempPref.qids objectAtIndex:k] stringValue]];

                NSLog(@"Stat -------> %@ - %@", tempStat.left, tempStat.right);
            }
        }
    }

    NSLog(@"END");
}

一切正常。

然而,当我从委托中按下按钮的方法运行相同的方法[myMap printClusters]时,它会打印第一行...“打印群集”。

然后是奇怪的线然后崩溃。

2 个答案:

答案 0 :(得分:2)

似乎clustersself的属性,但您永远不会保留它。由于它是使用方便方法创建的,该方法返回自动释放的字典,因此在方法范围完成时会释放它。当你第二次打电话时,它不再活着。

变化:

clusters = [NSDictionary dictionaryWithDictionary:parser.clusters];

...为:

self.clusters = [NSDictionary dictionaryWithDictionary:parser.clusters];

...或:

clusters = [[NSDictionary dictionaryWithDictionary:parser.clusters] retain];

...然后将对clusters的所有其他引用更改为self.clusters。对任何其他属性执行相同操作。

答案 1 :(得分:0)

好吧,按照TechZen的建议,我查看了填充NSDictionary的代码,发现我存储了有针对性的解析器变量。

相反,我改变了它们以分配自己的变量并改为存储它们。

对它进行了分类。

呜!

旧代码......

-(id)initWithName:(NSString *)inputName
{
    if (self = [super init])
    {
        name = inputName;
        fgids = [[NSMutableArray alloc] initWithCapacity:1];
    }
    return self;
}

新代码......

-(id)initWithName:(NSString *)inputName
{
    if (self = [super init])
    {
        self.name = [NSString stringWithString:inputName];
        self.fgids = [[NSMutableArray alloc] initWithCapacity:1];
    }
    return self;
}

呜!