我是否需要明确分配我的NSNumber?

时间:2009-04-29 01:55:57

标签: iphone objective-c memory-management

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

NSNumber *nn0 = [NSNumber numberWithInt:0];

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

如果我尝试在功能结束时发布,我会遇到问题:

[nn0 release];

我收到运行时错误。

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

3 个答案:

答案 0 :(得分:15)

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

有关便捷构造函数的说明以及如何管理内存,请参阅此页。

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

答案 1 :(得分:7)

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

如果你需要坚持使用该物体,你需要拥有它。因此,如果您知道您只需要此方法的编号(比如将其传递给数组或其他),请使用方便方法,然后将其保留。如果你想出于某种原因(例如实例变量)保留数字,那么你可以安全地分配/初始化它。

如果您发布了您不拥有的内容,则会出现运行时错误。

答案 2 :(得分:4)

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

  

如果返回对象的选择器中包含单词“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