编辑:这是针对静态NSMutableDictionary,而不是类成员。我看到很多答案认为它是一个班级成员,抱歉。感谢您的快速回复。
我有一段工作代码,但是它被使用了2次,所以我写了一个便利函数:
- (void) initializeDictionary:(NSMutableDictionary*)mutableDict fromPathName:(NSString*)path
{
mutableDict = // get from file, init if not there.
}
然后我发现什么都没有储存。单步执行代码,该函数会创建一个字典,但返回时“传入”值仍为零。这完全打破了我对指针的理解(不要采取错误的方式,我很舒服)。但我想,他们的目的是让你“通过地址”,这样我就可以保持它指向的东西。
因为mutableDict是“价值复制”,ARC似乎正在消除它。我在这里问,因为
当然,我可能会忽略一些简单的事情。
我似乎通过执行我在其他地方找到的回写技巧解决了这个问题:
- (void) initializeDictionary:(NSMutableDictionary* __strong *)mutableDictionary fromPath:(NSString*)path;
并使用&调用和* deref来改变值。它似乎远不如优雅。
答案 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];