代码之家  ›  专栏  ›  技术社区  ›  Danny Frencham

我需要显式分配我的nsnumber吗?

  •  9
  • Danny Frencham  · 技术社区  · 16 年前

    我定义的数字如下:

    NSNumber *nn0 = [NSNumber numberWithInt:0];
    

    它在没有任何分配的情况下工作正常。我的理解是,如果我使用numberWithint,则会自动调用alloc和init。

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

    [nn0 release];
    

    我得到一个运行时错误。

    我的问题是:如果我用numberWithint初始化nsnumber,我需要对它进行内存管理吗?

    3 回复  |  直到 11 年前
        1
  •  15
  •   Andy White    16 年前

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

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

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

        2
  •  7
  •   Jason Coco superfell    16 年前

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

    如果你需要这个物体留在周围,你就需要拥有它。所以如果你知道你只需要这个方法的数字(比如把它传递到一个数组或者其他的方法中),那么就使用这个方便的方法,并把它留在那里。如果出于某种原因(例如实例变量)想要保留这个数字,那么可以安全地分配/init它。

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

        3
  •  4
  •   Barry Wark    16 年前

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

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

    否则 你不拥有它 不应该释放它。如果要保留对非拥有对象的引用,则应调用 -[NSObject retain] 在那种情况下。您现在“拥有”该实例,因此必须调用 -[NSObject release] 当你完成它的时候。因此,您不拥有由返回的实例 -[NSNumber numberWithInt:] 不应该打电话 -release 当你完成的时候。如果要使返回的实例超出当前作用域(实际上超出了当前作用域的生存期 NSAutoreleasePool 例如),你应该 -retain 它。

    在雷吉斯的术语中,彼得·霍西在他的 blog . 如果方法选择器与此regex匹配,则拥有返回的对象实例:

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

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