无法将NSMutableDictionary发送到另一个类

时间:2011-07-06 16:37:41

标签: iphone objective-c cocoa nsmutabledictionary

所有

我正在尝试将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

2 个答案:

答案 0 :(得分:3)

您确定使用 initXMLParser 方法初始化实例吗?您可能正在使用常规的 init ,并且没有初始化响应变量。

总的来说,这些问题通常很容易跟踪。如果某些东西是 nil 而不是实例 - 那么它没有被初始化或者某个地方无效。在您的代码中,有两行具有响应分配,两者都应该有效。所以,我猜它错过了初始化(if - > if如果没有调用第二个init的分支)。

答案 1 :(得分:1)

这里有一些事情。

你在使用ARC吗?如果没有,你将在整个地方泄漏内存,因为你没有进行任何内存管理。

您指定的初始化程序- (id)initXMLParser;在某些地方出错了。

我实际上无法在您的代码中看到使用response的任何地方。

要修复指定的init方法,您应该这样做。

  1. 删除未使用的init方法
  2. init方法应返回id
  3. 类型
  4. 您应确保正确覆盖方法

    - (id)initXMLParser
    {
        self = [super init];
        if (self) {
          response = [[NSMutableDictionary alloc] init];
          count = 1;
        }
        return self;
    }
    
  5. 这将确保您的init方法在开始时是正确的,但您仍然遇到任何数据实际上都没有添加到response的问题。