使用Arc不保留功能参数?

时间:2014-01-09 09:58:27

标签: ios automatic-ref-counting

编辑:这是针对静态NSMutableDictionary,而不是类成员。我看到很多答案认为它是一个班级成员,抱歉。感谢您的快速回复。

我有一段工作代码,但是它被使用了2次,所以我写了一个便利函数:

- (void) initializeDictionary:(NSMutableDictionary*)mutableDict fromPathName:(NSString*)path
{ 
     mutableDict = // get from file, init if not there.
}

然后我发现什么都没有储存。单步执行代码,该函数会创建一个字典,但返回时“传入”值仍为零。这完全打破了我对指针的理解(不要采取错误的方式,我很舒服)。但我想,他们的目的是让你“通过地址”,这样我就可以保持它指向的东西。

因为mutableDict是“价值复制”,ARC似乎正在消除它。我在这里问,因为

  1. 其他问题则有相反的问题“这为什么会被保留?”和
  2. 这似乎不对。你的任何指针语言的第一个教程是“所以你可以搞乱原始值”。 Arc确实这样做了吗?有没有我没有得到的概念?
  3. 当然,我可能会忽略一些简单的事情。

    我似乎通过执行我在其他地方找到的回写技巧解决了这个问题:

    - (void) initializeDictionary:(NSMutableDictionary* __strong *)mutableDictionary fromPath:(NSString*)path;
    

    并使用&调用和* deref来改变值。它似乎远不如优雅。

3 个答案:

答案 0 :(得分:2)

您传递了NSDictionary的指针。如果你更改mutableDict的指针值(通过分配或赋值),这将不会反映在作为此函数的参数传递的变量上,并且因为mutableDict在函数中本地定义,它将由ARC释放自动。 (不要忘记,即使是指针,传递给函数时也会复制地址)。

你的第二个解决方案有效的原因是你将指针传递给指针(不确定那里是否需要强)。由于您更新了*mutableDict指向的地址中的值,因此mutableDict的值将反映在外部。此值是您分配的字典的地址,因为您通过指针更改它,它将反映在函数外部。

答案 1 :(得分:2)

做你想做的事情你使用多个间接

- (void) initializeDictionary:(NSMutableDictionary**)mutableDict fromPathName:(NSString*)path
{ 
     mutableDict = // get from file, init if not there.
}

注意参数是(NSMutableDictionary **),指向NSMutableDictionary的指针。

要调用该方法,您需要创建一个指针并将其传递给:

NSMutableDictionary *mutableDictionary;
[self initializeDictionary: &mutableDictionary fromPathName:...];

返回时,mutableDictionary变量将由方法初始化。

然而,从方法中返回字典可能更容易,而不是这样做。

答案 2 :(得分:0)

在Objective-C中,如果在方法中定义变量,则该变量仅在该方法中可见。

如果您需要保存变量以在外面使用它,您需要从函数中“返回”它。你所做的不是技巧,是另一种返回变量的方法。

尝试:

- (void)initializeDictionaryFromPath:(NSString*)path {
    NSMutableDictionary *mutableDict = // your initialization 
    return mutableDict;
}

然后您可以使用以下代码定义字典:

NSMutableDictionary *mutableDict = [self initializeDictionaryFromPath:path];