将本地指针保留在类级别NSDictionary中

时间:2013-01-31 23:46:02

标签: ios pointers nsdictionary

如果我有一个指向自定义类的本地指针,如何将其指针存储在类级NSDictionary变量中,并在其初始创建范围终止后使用它。

如何在我创建它的类超出范围之前告诉编译器保留new创建的内存?

这是sudo代码,用于表示相关变量的范围。

Class {

    NSMutableDictionary* allElements;

    SomeFunction {

       InnerClosure1 {

       DefaultElement* element = [DefaultElement new];
       [allElements setObject:element forKey:@:"Foo"];

       }

       InnerClosure2 {

          DefaultElement* element = [allElements objectForKey:@"Foo"];

      }
}

问题是我在尝试将指针放入字典后得到此错误:

  

[__ NSDictionaryI setObject:forKey:]:发送到的无法识别的选择器   实例0x94421d0 2013-01-31 23:35:32.575   Muskoka-Domicile [1371:19d03] * 由于未被捕获而终止应用程序   异常'NSInvalidArgumentException',原因:' - [__ NSDictionaryI   setObject:forKey:]:无法识别的选择器发送到实例0x94421d0'

我怀疑它与转移自定义类的所有权有关?

修改 的 结果是将NSMutableDictionary *初始化为NSDictionary ...

1 个答案:

答案 0 :(得分:2)

您的本地指针可能会丢失。你感兴趣的是你指向的内存(对象)块。

当您向NSDictionary添加任何对象时,该字体将保留该对象。你可以离开scope1,你的对象就可以了。事实上,如果你没有使用arc,在将你的元素添加到字典后,通常会调用[element release]来平衡你对new的调用。

稍后,当您将对象拉出字典时,您只需使用对象的内存地址更新临时指针(元素)。在'Scope2'中由于您没有创建对象,因此在完成后不会释放它。

希望有助于澄清事情。

修改/更新 我应该注意,你的代码基本上是正确的。如果要将对象放入字典中,则需要NSMutableDictionary,因此请在代码顶部创建其中一个。接下来,您应该致电setObject:forKey:而不是setValue。这应该为你做的伎俩。您可能需要向(DefaultElement *)添加强制转换以在将元素拉出字典时禁止显示警告。