-2

我遇到了字典timeStamps将所有值更改为null. 键都很好,即使我将键切换为值,反之亦然。无论顺序如何,值最终都为null,而键最终完全按照应有的方式结束。

这是代码。它是一个 xml 解析器。它正在构建一个字典,其中包含一组键代码和一组值时间戳。键和值是表示类别的并行数组。

所有变量都在别处分配和启动。这将导入具有所有这些变量作为属性的头文件。@property (strong, nonatomic) Type variableName;然后在主文件中有一行@synthesize variableName. 此外,它具有variableName = [[Type alloc] init];. 谢谢大家的帮助!

- (void) didStartElement (elementname is passed as xml tag)
{
    //Tells us if we are in the dance categories
    if ([elementName isEqualToString:@"categories"])
    {
        isCategory = YES; // Just tells us we're ready to start reading

    }
    else if ([elementName isEqualToString:@"category"] && isCategory) 
    {
        onCategory = YES; // 
    }
}


- (void) foundCharacters (currentNodeContent is the info between tags)
{
    currentNodeContent = (NSMutableString *) string;
}


- (void) didEndElement
{
    // if leaving dance categories
    if ([elementName isEqualToString:@"Category End"])
    {
        isCategory = NO; // We've left a category
    }
    else if ([elementName isEqualToString:@"code"] && onCategory)
    {
        Code               = currentNodeContent;
        currentNodeContent = nil;
        isWaitingForTime   = YES;
    }

    else if ([elementName isEqualToString:@"time"] && isWaitingForTime)
    {
        [runningList       addObject:Code];
        [runningList   addObject:currentNodeContent];

        isWaitingForTime   = NO;
        currentNodeContent = nil;
        Code               = @"";
    }

    else if ([elementName isEqualToString:@"dances"])
    {
        [timeStamps setObject:runningTimeList forKey:runningList];
        [runningTimeList   removeAllObjects];
        [runningList       removeAllObjects];
    }
}
4

3 回答 3

1

您必须初始化数组和字典。
这应该有效:

NSMutableArray *Array1 = [NSMutableArray new];
NSMutableArray *Array2 = [NSMutableArray new];

[Array1 addObject:@"Hello"];
[Array2 addObject:@"Hi"];

NSMutableDictionary *dictionaryOfArrays = [NSMutableDictionary new];

[dictionaryOfArrays setObject:Array2 forKey:Array1];

NSLog(@"dictionary: %@", dictionaryOfArrays);

如果您计划一次只存储一个对象,则不必为此创建数组。您可以在此方法中设置实际的 NSStrings,因为它将 anyid作为对象,将字符串作为键。

否则,您应该使用该方法setObjects:forKeys:而不是该方法。

于 2013-07-23T22:08:25.513 回答
0

我不确定您在这里真正要问的是什么,但让我们看看以下是否有帮助。

首先根据您的代码片段考虑此方法:

- (void) test
{
   NSMutableArray *Array1 = [NSMutableArray new];
   NSMutableArray *Array2 = [NSMutableArray new];

   [Array1 addObject:@"Hello"];
   [Array1 addObject:@"There"];
   [Array2 addObject:@"Hi"];
   [Array2 addObject:@"Welcome"];

   NSMutableDictionary *dictionaryOfArrays = [NSMutableDictionary new];

   [dictionaryOfArrays setObject:Array2 forKey:Array1];

   // arrays are ordered, use key with elements in different order to show this
   [dictionaryOfArrays setObject:Array2 forKey:@[@"There", @"Hello"]];

   NSLog(@"dictionary: %@", dictionaryOfArrays);
}

这将输出到控制台:

dictionary: {
        (
        There,
        Hello
    ) =     (
        Hi,
        Welcome
    );
        (
        Hello,
        There
    ) =     (
        Hi,
        Welcome
    );
}

这表明可以是一个数组 - 数组中元素的顺序很重要。

但是,您真的想使用数组作为键吗?虽然将作为数组很常见,但键也是数组并不常见。

你说你要么得到要么( )“空”。那么第一个可能是一个没有元素的数组 - 这与没有数组不同。至于第二个,您不能存储nil在 a 中,NSDictionary但是如果您查找不存在的键的值,nil则返回 - 即nil返回意味着不存在的键。

最后,如果它是相关的,当一个键/值对被添加到字典中时,键被复制而值被简单地引用。这意味着如果您使用一个可变对象作为键,例如一个NSMutableString实例,那么该对象的后续突变不会影响字典。但是,如果(键/值对的)值是可变对象,则查找操作返回与插入的完全相同的对象,该对象可能在插入后发生了变异。

您添加到问题中的代码根本没有澄清。

希望这里有帮助。

于 2013-07-24T00:54:11.553 回答
0

问题是您将可变数组设置为字典的键。数组被复制然后存储到字典中。如果您不更改数组,objectForKey:将始终返回您正在寻找的值。但是,如果您向其中添加任何对象,则数组会发生变异,并且不再等于存储在字典中的副本。

从代码来看,您似乎根本不需要字典,您只是使用字典来存储每个结果,因此您可能需要替换timeStamps为 aNSMutableSetNSMutableArray

PS:还记得添加的副本runningTimeList,而不是原始数组。这是因为您不是在每次结束元素时都创建数组,而只是清空它。这意味着所有键都指向同一个数组。

于 2013-07-24T00:35:10.903 回答