如果我有一个指向自定义类的本地指针,如何将其指针存储在类级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 ...
答案 0 :(得分:2)
您的本地指针可能会丢失。你感兴趣的是你指向的内存(对象)块。
当您向NSDictionary添加任何对象时,该字体将保留该对象。你可以离开scope1,你的对象就可以了。事实上,如果你没有使用arc,在将你的元素添加到字典后,通常会调用[element release]
来平衡你对new
的调用。
稍后,当您将对象拉出字典时,您只需使用对象的内存地址更新临时指针(元素)。在'Scope2'中由于您没有创建对象,因此在完成后不会释放它。
希望有助于澄清事情。
修改/更新强>
我应该注意,你的代码基本上是正确的。如果要将对象放入字典中,则需要NSMutableDictionary
,因此请在代码顶部创建其中一个。接下来,您应该致电setObject:forKey:
而不是setValue
。这应该为你做的伎俩。您可能需要向(DefaultElement *)
添加强制转换以在将元素拉出字典时禁止显示警告。