-2

如果我有一个指向自定义类的本地指针,我如何将其指针存储在类级别的 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...

4

1 回答 1

2

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

当您将任何对象添加到 NSDictionary 时,该对象将由字典保留。您可以离开 scope1 并且您的对象会很好。事实上,如果您不使用 arc,在将元素添加到字典后,您通常会调用[element release]以平衡对new.

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

希望这有助于澄清事情。

编辑/更新 我应该注意,您的代码基本上是正确的。如果要将对象放入字典中,则需要一个NSMutableDictionary,因此在代码顶部创建一个。接下来,您应该调用setObject:forKey:not setValue。那应该对你有用。(DefaultElement *)当您将元素从字典中拉出时,您可能需要添加强制转换来抑制警告。

于 2013-02-01T00:41:35.930 回答