所有
我正在尝试将NSMutableDictionary“响应”发送到我的另一个类,或者更确切地说,让另一个类从此类中提取字典。当另一个类使用“getResponse”方法时,它返回null。
我附加的代码是我的XML解析器,它将我需要的信息放入字典中。最底层是在NSLog中显示“(null)”的方法。我已经为你评论过了。
编辑:我确实使用initXMLParser方法在其他类中初始化。但即使如此,在这个课程中访问甚至都不起作用。在显示响应字典的getResponse方法中,NSLog不会显示除“TEST(null)”之外的任何内容。
#import "XMLParser.h"
@implementation XMLParser
@synthesize response;
- (id)init
{
self = [super init];
if (self) {
// Initialization code here.
}
return self;
}
- (XMLParser *) initXMLParser //not sure if this is necessary anymore - CHECK THIS
{
self = [super init];
// init array of return data
NSLog(@"Initializing self and super...");
response = [[NSMutableDictionary alloc] init];
count = 1;
return self;
}
//Gets Start Element of SessionData
- (void)parser:(NSXMLParser *)parser
didStartElement:(NSString *)elementName
namespaceURI:(NSString *)namespaceURI
qualifiedName:(NSString *)qualifiedName
attributes:(NSDictionary *)attributeDict
{
if ([elementName isEqualToString:@"SessionData"])
{
NSLog(@"Found SessionData in the return XML! Continuing...");
//response is a NSMutableArray instance variable (see .h of this)
if (!response)//if array is empty, it makes it!
{
NSLog(@"Dictionary is empty for some reason, creating...");
response = [[NSMutableDictionary alloc] init];
count=1;
}
return;
}
else
{
currentElementName = elementName;
NSLog(@"Current Element Name = %@", currentElementName);
return;
}
}
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
if (!currentElementValue) {
// init the ad hoc string with the value
currentElementValue = [[NSMutableString alloc] initWithString:string];
} else {
// append value to the ad hoc string
[currentElementValue setString:string];
NSLog(@"Processing value for : %@", string);
}
}
//Gets End Element of SessionData
- (void)parser:(NSXMLParser *)parser
didEndElement:(NSString *)elementName
namespaceURI:(NSString *)namespaceURI
qualifiedName:(NSString *)qName {
if ([elementName isEqualToString:@"SessionData"])
{
// We reached the end of the XML document
//dumps dictionary into log
NSLog(@"Dump:%@", [response description]);
return;
}
else
{
//Adds key and object to dictionary
[response setObject:currentElementValue forKey:currentElementName];
NSLog(@"Set values, going around again... brb.");
}
currentElementValue = nil;
currentElementName = nil;
}
- (NSMutableDictionary*)getResponse
{
NSLog(@"%@", [self response]; //THIS RETURNS NULL
return response;
}
@end
答案 0 :(得分:3)
您确定使用 initXMLParser 方法初始化实例吗?您可能正在使用常规的 init ,并且没有初始化响应变量。
总的来说,这些问题通常很容易跟踪。如果某些东西是 nil 而不是实例 - 那么它没有被初始化或者某个地方无效。在您的代码中,有两行具有响应分配,两者都应该有效。所以,我猜它错过了初始化(if - > if如果没有调用第二个init的分支)。
答案 1 :(得分:1)
这里有一些事情。
你在使用ARC吗?如果没有,你将在整个地方泄漏内存,因为你没有进行任何内存管理。
您指定的初始化程序- (id)initXMLParser;
在某些地方出错了。
我实际上无法在您的代码中看到使用response
的任何地方。
要修复指定的init方法,您应该这样做。
id
您应确保正确覆盖方法
- (id)initXMLParser
{
self = [super init];
if (self) {
response = [[NSMutableDictionary alloc] init];
count = 1;
}
return self;
}
这将确保您的init方法在开始时是正确的,但您仍然遇到任何数据实际上都没有添加到response
的问题。