【问题标题】:Do I need to explicitly alloc my NSNumber?我需要明确分配我的 NSNumber 吗?
【发布时间】:2009-04-29 01:55:57
【问题描述】:

我在定义一个数字,如下:

NSNumber *nn0 = [NSNumber numberWithInt:0];

没有任何分配也可以正常工作。我的理解是,如果我使用 numberWithInt,alloc 和 init 会自动调用。

如果我尝试在函数结束时释放,我会遇到问题:

[nn0 release];

我收到运行时错误。

我的问题是:如果我使用 numberWithInt 来初始化 NSNumber,我是否需要对其进行任何内存管理?

【问题讨论】:

    标签: iphone objective-c memory-management


    【解决方案1】:

    许多类型的“便利构造函数”会生成一个自动“自动释放”的对象 - 即新对象将由当前的 NSAutoreleasePool 保留。您不需要手动释放这些对象 - 它们将在当前 NSAutoreleasePool 被释放/耗尽时被释放。

    有关便利构造函数的描述,以及如何为这些构造函数管理内存,请参阅此页面。

    http://www.macdevcenter.com/pub/a/mac/2001/07/27/cocoa.html?page=3

    【讨论】:

    • 只是好奇为什么这会被否决?这不准确吗?我对 mac dev 还很陌生,只是想提供一些帮助。
    • 这可能是由于术语。基本上,便利方法(或您无法控制的任何方法)返回的任何内容都不会被视为“自动释放”。相反,它被视为您“不拥有”。关键是,内存的实际管理方式与您不“拥有”的对象无关。
    • 由于链接的原因,我将此回复标记为正确回复。杰森,你的回答也很好,我希望我能把两个都标记为正确答案。
    • 是的,我给他 +1 只是因为我打赌这与术语之类的愚蠢有关。
    • @deadcat - 我想 :) 链接总是有用的!
    【解决方案2】:

    只需遵循核心内存管理规则:如果您“拥有”变量,则最终必须放弃所有权。您通过以下方式取得所有权:创建对象(alloc/new/copy)或特别取得所有权(保留)。在所有这些情况下,您都需要释放它。

    如果您需要对象留下来,您需要拥有它。因此,如果您知道您只需要此方法的数字(例如将其传递到数组或其他任何内容),请使用便捷方法并将其保留。如果您出于某种原因想要保留该数字(例如实例变量),那么您可以安全地分配/初始化它。

    如果你发布了不属于你的东西,你会得到一个运行时错误。

    【讨论】:

      【解决方案3】:

      规则很简单,只有极少数例外:

      如果返回对象的选择器中包含“new”、“alloc”、“retain”或“copy”等词,则您拥有返回的对象并负责在完成后释放它。

      否则您不拥有它并且不应发布它。如果要保留对非拥有对象的引用,则应在该实例上调用 -[NSObject retain]。您现在“拥有”该实例,因此当您完成该实例时,必须在该实例上调用 -[NSObject release]。因此,您不拥有-[NSNumber numberWithInt:] 返回的实例,完成后不应调用-release。如果你想让返回的实例超出当前范围(真的超出当前NSAutoreleasePool实例的生命周期),你应该-retain它。

      在 RegEx 术语中,Peter Hosey 在他的blog 中很好地阐述了这一点。如果方法选择器与此正则表达式匹配,则您拥有返回的对象实例:

      /^retain$|^(alloc|new)|[cC]opy/
      

      当然,最终参考是Memory Management Programming Guide for Cocoa

      【讨论】:

      • 我发现该正则表达式的唯一例外:NSData +dataWithBytesNoCopy:length:[freeWhenDone:],尽管它的名称返回一个自动释放的 NSData。甚至 Build-and-Analyze/clang checker 也弄错了。
      猜你喜欢
      • 1970-01-01
      • 2013-11-25
      • 2018-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-08
      相关资源
      最近更新 更多