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

NSNumber *nn0 = [NSNumber numberWithInt:0];

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

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

[nn0 release];

我收到运行时错误。

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

有帮助吗?

解决方案

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

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

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

其他提示

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

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

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

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

  

如果返回对象的选择器具有单词“new”,“alloc”,“retain”,则或“复制”或在它中,然后你拥有返回的对象,并负责在你完成后释放它。

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

在RegEx术语中,Peter Hosey在他的博客。如果方法选择器与此正则表达式匹配,则您拥有返回的对象实例:

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

当然,最新的参考资料是内存管理编程指南可可

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top