【问题标题】:Do I need to release NSNumbers added to a NSDictionary myself?我需要自己发布添加到 NSDictionary 的 NSNumbers 吗?
【发布时间】:2011-08-12 21:56:03
【问题描述】:

我正在创建一个 NSDictionary,它将对象映射到整数,并且因为 NSDictionaries 除了对象之外不处理任何东西,我必须用 [NSNumber numberWithInt:30] 或你有什么将每个整数包装在一个 NSNumber 对象中。我不清楚的是我是否需要释放我正在创建的所有这些 NSNumber 对象。我实际上并没有为它们分配空间,所以它们必须在自动释放池中,但我可以确定 NSDictionary 对象正确地保留和释放它们吗?假设我正在设置

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

当我使用完 NSDictionary 后,我会正确地发布它(因为我正在在我自己的代码中为它分配空间)。

【问题讨论】:

    标签: ios memory-management


    【解决方案1】:

    不,NSNumber 对象是自动释放的。

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

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

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

    【讨论】:

    • numberWithInt 是一种方便的方法(即在类上调用它)。因此,由于您没有调用名为 initXXX 的方法,因此根据内存管理规则,对象将自动释放返回。
    • 正确。但是你需要检查是否需要手动释放或者使用自动释放机制——后者适用于这种情况
    【解决方案2】:

    没有。你做得很好。

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

    不过,请注意几点,以免您粗心大意。您意识到 NSNumber 是键,而 objectOne 是存储在字典中的值吗?这没关系,因为 NSNumber 符合 NSCopying 协议,这是用作键的对象的要求。

    【讨论】:

    • 啊,你是对的,NSDictionary 以这种方式初始化,接受对象对 Value-Key-Value-Key,而不是 Key-Value-Key-Value。虽然这对我的目的无关紧要。我仍然不清楚 如何 我知道 NSDictionary 将保留进入 is 的自动释放对象。这只是对象必须被设计做的事情吗?这意味着我必须检查文档中是否有任何可能包含另一个对象的对象?或者我可以用其他一些概括来告诉我该怎么做?
    • 所有集合都保留它们的对象。想想你会怎么做。把它想象成属性——你编写一个带有属性的自定义类,你将这些属性设置为对象,你的类保留它的属性。这出现在整个 iOS 上。您的应用程序的主窗口保留它的视图控制器,视图保留它们的子视图,当您显示模态视图控制器时,它也会保留。基本上; iOS 会保留它需要保留的任何东西,无论是集合中的对象还是视图控制器。
    • 我的意思是——“你会习惯的”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-16
    • 1970-01-01
    相关资源
    最近更新 更多