我是否需要明确分配我的NSNumber?
-
03-07-2019 - |
题
我正在定义一个数字,如下所示:
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/
当然,最新的参考资料是内存管理编程指南可可。