我有一个数据结构对象,它是从委托的“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]时,它会打印第一行...“打印群集”。
然后是奇怪的线然后崩溃。
答案 0 :(得分:2)
似乎clusters
是self
的属性,但您永远不会保留它。由于它是使用方便方法创建的,该方法返回自动释放的字典,因此在方法范围完成时会释放它。当你第二次打电话时,它不再活着。
变化:
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;
}
呜!