我正在定义一个数字,如下所示:
NSNumber *nn0 = [NSNumber numberWithInt:0];
没有任何分配,它工作正常。我的理解是,如果我使用numberWithInt,则会自动调用alloc和init。
如果我尝试在功能结束时发布,我会遇到问题:
[nn0 release];
我收到运行时错误。
我的问题是:如果我使用numberWithInt初始化NSNumber,我是否必须对其进行任何内存管理?
答案 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/