将NSDictionary传递给函数以添加对象/键但在main()中显示为空

时间:2014-09-28 15:27:06

标签: ios objective-c pointers nsdictionary

我是Objective C的新手,我在添加到我的NSMutableDictionary时遇到了问题。我有一个包含以下方法的Thing类。

-(BOOL) addThing:(Thing*)myThing withKey:(NSString*)key inDictionary:(NSMutableDictionary*) myDictionary
{
    if(!myDictionary) { //lazy initialization
       myDictionary = [NSMutableDictionary dictionary];
       [myDictionary setObject:myThing forKey:key];
       return YES;
    } 
    else {
       if(![myDictionary allKeysForObject: _monster]) {
         [myDictionary setObject:record forKey:key];
         return YES;
       }
       else {
         NSLog(@"The username %@ already exists!", _monster);
         return NO;
    }
  }

}

但是当我在main()中调用它时,字典仍然显示为空。

int main(int argc, const char * argv[]) {
@autoreleasepool {
    NSMutableDictionary *myDictionary;

    Thing *foo = [Thing thingWithName:@"Frankenstein" andFeature:@"green"];
    [foo addThing:foo withKey:@"foo" inDictionary:myDictionary];

    if([myDictionary count] > 0) {
        NSLog(@"I'm not empty!");
    }
    else {
        NSLog(@"Dictionary is empty");
    }

    //Prints out "Dictionary is empty"

}
return 0;

}

如果我直接在我的addThing方法中进行计数检查,它将打印"我不是空的!"。我不确定我做错了什么。

2 个答案:

答案 0 :(得分:1)

您的问题是您只是在myDictionary中初始化局部变量addThing:withKey:inDictionary。 为了能够影响您作为参数传递的NSDictionary,您必须确实将NSDictionary **传递给您的函数,并将其视为指针,即将其用作*myDictionary < / p>

确实有用的东西是:

- (BOOL) addThing:(id)thing withKey:(NSString *)key inDictionary:(NSMutableDictionary **)myDictionary{
   if(!*myDictionary && key && thing){
      *myDictionary = [NSMutableDictionary dictionary];
      [*myDictionary setObject:thing forKey:key];
      return YES;
   } else {
     // Removed this code as it doesn't really matter to your problem
     return NO;
   }
}

并调用它(注意传递dict变量的地址而不是普通变量):

NSMutableDictionary *dict;
[foo addThing:foo withKey:@"key" inDictionary:&dict]

这确实会将dict转换为非零字典,前提是你没有传递nil keything,它将包含对象foo for key {{ 1}}。

我测试过没有错误。

答案 1 :(得分:0)

即使这是客观C而不是普通C,您对该方法的调用仍然是按值调用,而不是通过引用调用。你的方法调用[foo addThing:foo withKey:@“foo”inDictionary:myDictionary]创建指针myDictionary的副本,并将其发送到你的方法。字典被创建然后丢失,因为这里没有机制将其复制回主要功能中的真实myDictionary。如果您仍然不确定,请按引用查询呼叫并按值调用。在addThing方法中创建的myDictionary是原始myDictionary的副本,不会影响您的全局。