ios - 使用 Arc 不保留函数参数?

标签 ios automatic-ref-counting

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

我有一段有效的代码,但它被使用了 2 次,所以我写了一个方便的函数:

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

然后我注意到没有任何保存。单步执行代码,该函数创建了一个字典,但返回时“传入”的值仍然为 nil。这完全颠覆了我对指针的理解(不要误会,我很舒服)。但我想,它们的目的是让你“传递地址”,这样我就可以为它指向的东西添加水分。

由于 mutableDict 是“值副本”,ARC 似乎正在将其清除。我在这里问是因为

  1. 其他问题有相反的问题“为什么要保留这个?”和
  2. 这似乎不对。您使用任何指针语言的第一个教程是“这样您就可以弄乱原始值”。 Arc 真的这样做吗?有没有我不明白的概念?

当然,我可能忽略了一些简单的事情。

我似乎已经通过在别处找到的写回技巧解决了这个问题:

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

并使用 & 调用和 * deref 更改值。它似乎远不够优雅。

最佳答案

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

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

关于ios - 使用 Arc 不保留函数参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21016877/

相关文章:

ios - 添加 libz.1.2.3.dylib 与 libz.1.1.3.dylib 或 libz.1.2.5.dylib

ios - ARC ViewController 被释放

objective-c - 我正在使用 ARC 在 Objective-C 中编写一个 Button 类——如何防止 Clang 在选择器上发出内存泄漏警告?

ios - Swift:不能用类型索引下标 [String:NSObject] 的值?

ios - 将完成处理程序池在一起,以便在执行多个闭包后方法完成

ios - NSDate 'isEqualToString' 崩溃?

ios - 如何在 xcode 中将 ARC 启用 .a 文件添加到非 ARC 项目

ios - for 循环中的强类对象未保留在 ARC 中

ios - stringWithFormat和initWithFormat在ARC中导致不同的值

ios - carthage build 不适用于 Xcode 12.0,它适用于 Xcode 11.3。任务失败,退出代码 1 :