2011-08-12 35 views
2

我创建了一个将对象映射到整数的NSDictionary,并且由于NSDictionaries除了对象之外不处理任何对象,所以我必须用[NSNumber numberWithInt:30]来包装NSNumber对象中的每个整数,或者你有什么。我不清楚的是我是否需要释放所有我创建的NSNumber对象。我实际上并没有为它们分配空间,所以它们必须位于autorelease池中,但是我可以确定NSDictionary对象正在保留并正确释放它们吗?比方说,我设置我是否需要将NSNumbers自己添加到NSDictionary中?

NSDictionary * myDict = [[NSDictionary alloc] initWithObjectsAndKeys: objectOne, [NSNumber numberWithInt: 30], nil]; 

,我正确释放的NSDictionary时,我用它做(因为我上午 alloc'ing我自己的代码中对于空间)。

回答

2

nope NSNumber对象是autoreleased。

将它们添加到NSDictionary将导致将保留消息发送到您添加的每个NSNumber对象。

根据内存管理规则,你不拥有这些对象 - NSDictionary以某种方式做 - 因此你不负责释放它们,NSDictionary对象将做到这一点。

但是您拥有使用alloc & initWithObjectsAndKeys创建的NSDictionary :.因此,您需要注意管理myDict对象的内存。

+1

numberWithInt是一种方便的方法(即在类上调用它)。因此,由于您没有调用称为initXXX的方法,因此根据内存管理规则,该对象将返回自动释放。 – Oli

+0

正确。但你需要检查是否有必要手动释放它或使用自动释放机制 - 后者适用于这种情况 – Wizz

1

不,你做得很好。

您正在将一个自动释放的NSNumber添加到字典中。字典将保留NSNumber,所以当它最终自动释放时,它仍然是有效的。

然而,只有几点,所以你不会疏忽大意。你意识到NSNumber是关键,objectOne是存储在字典中的值?这是可以的,因为NSNumber符合NSCopying协议,这是用作键的对象的要求。

+0

啊,你是对的,NSDictionary初始化了这种方式需要在对象对中值 - 键 - 值 - 键,而不是键值键值。虽然这对我的目的无关紧要。我仍然不清楚究竟* *我知道NSDictionary将保留进入的自动释放对象。这只是对象必须设计的目的 - 这意味着我必须检查可能包含另一个对象的任何对象的文档?还是有一些其他的概括我可以用来告诉该怎么做? – Tneuktippa

+2

所有集合保留其对象。想想你会怎么做。把它看作属性 - 你写一个带有属性的自定义类,你将这些属性设置为对象,并且你的类保留它的属性。这显示在iOS上。你的应用程序的主窗口保留它的视图控制器,视图保留它们的子视图,当你显示一个模式视图控制器时,它也被保留下来。基本上; iOS保留了它需要保留的任何东西,无论是集合中的对象还是视图控制器。 – Abizern

+0

我的意思是说 - “你会习惯它” – Abizern

相关问题