Странный вывод при попытке доступа к данным - PullRequest
0 голосов
/ 15 августа 2010

У меня есть объект структуры данных, который загружается из файла XML в методе «завершил загрузку» делегата.

Если я использую объект данных «printData» изнутри метода load делегата, он показывает всю информацию. Я могу сделать это несколько раз.

Однако у меня есть кнопка, которая запускает второй метод в делегате, и все, что он делает, это запускает метод printData моего объекта данных, но все, что я получаю, это либо ничего, либо какой-то текст произвольного свойства.

например. "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 ]

2 голосов
/ 15 августа 2010

Кажется, что clusters является свойством self, но вы никогда не сохраняете его. Поскольку он создается с помощью вспомогательного метода, который возвращает автоматически выпущенный словарь, он освобождается после завершения области действия методов. Когда вы называете это во второй раз, он больше не жив.

Изменение:

clusters = [NSDictionary dictionaryWithDictionary:parser.clusters];

... чтобы:

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

... или:

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

... и затем измените все другие ссылки на clusters на self.clusters. Сделайте то же самое для любых других свойств.

0 голосов
/ 16 августа 2010

Что ж, следуя совету TechZen, я взглянул на код, который заполнял NSDictionary и обнаружил, что хранил указанные переменные синтаксического анализатора.

Вместо этого я изменил их, чтобы выделить свои собственные переменные и сохранитьвместо них.

Вот и все.

Woo!

Старый код ...

-(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;
}

Ву!

...