目标C释放,自动释放,以及数据的类型
-
10-07-2019 - |
题
我是新来的记忆管理的码但我得到这个想法很好。
在把我的应用程序通过泄漏的工具,在模式时,我注意到的我只需要清理我的自定义的对象,但不是动态创建的阵例如,所以我想这些数据的类型是个-是有道理的,因为我只有释放阵列,我作为性能,有一个(保留)。
然后我发现了一些奇特:我得到一个泄漏在一定列初始化这样的:
NSMutableArray *removals = [NSMutableArray new];
但没有一个类似的
NSMutableArray *removals = [NSMutableArray arrayWithCapacity:9];
现在,其原因之一是建立与"新的",它可以0-99的项目,而另一个我知道的就是要永远以9.由于这两个阵列传递给相同的方法,以后根据用户相互作用,我是获得有泄漏,如果我没有发布结束时的方法,或一种例外如果我没有!
我改变了第一阵
NSMutableArray *removals = [NSMutableArray arrayWithCapacity:99];
我没有泄漏和没有释放任何东西。任何人都可以解释一下吗?
解决方案
正如在 存管理规则, 每当你有一个对象你已经创建了与 +alloc
, +new
, -copy
, 或 -mutableCopy
, 你拥有它并负责释放它在某一点。(事实上, +new
只是简写 [[MyClass alloc] init]
.) 正如你指出,创建一系列通过 [NSArray new]
不释放这是一个存储器泄漏。然而,如果处理此目的正常,通常可以释放它在某一点。例如:
如果的方法, 使用 该阵列所谓的从 内 该方法,创造阵列,然后你应该能够释放阵后这已经使用。如果内心的方法需要保持更多的永久参考阵周围,那么该方法被负责发送
-retain
并最终-release
的对象。例如:- (void)myMethod { NSArray *removals = [NSArray new]; // ... [someObject someOtherMethod:removals]; [removals release]; }
如果你创造了列在一个
-init
方法 对于一个目的,那么-dealloc
方法 可以释放时的目的是摧毁。如果你需要创建一阵然后 返回 从方法,你已经发现了这个原因,autoreleasing的发明。叫你的方法是不负责释放的对象,因为它不是一个
+alloc
,+new
,-copy
, 或-mutableCopy
方法,但你需要保证被释放。在这种情况下,你的手电话-autorelease
在目前返回。例如:- (NSArray *)myMethod { NSArray *removals = [NSArray new]; // ... return [removals autorelease]; }
当你创建的阵通过 +arrayWithCapacity:
, 你不呼叫一个"特别"的方法,所以你没有释放的结果。这是可能实现 -autorelease
, 很像的最后一个例子上,但不一定。(顺便说一句,你还可以创建一个空个NSMutableArray与 [NSMutableArray array]
;该方法被发现是,所以它不会在该议题下的文NSMutableArray,但它将创造一个可变的阵时发送给NSMutableArray类。) 如果你要返回阵列从你的方法,可以使用这样的缩写 [[[NSMutableArray alloc] init] autorelease]
—但这仅仅是一个快捷方式。在许多情况下,虽然,您可以创建一个对象 -init
或 +new
并手动释放在适当的时间。
其他提示
这是在幕后实现的方式:
+(NSMutableArray*) new
{
return [[NSMutableArray alloc] init];
}
和
+(NSMutableArray*) arrayWithCapacity:(NSNumber)capacity
{
return [[NSMutableArray alloc] initWithCapacity:capacity] **autorelease**];
}
在第一种情况下,数组仅被分配,您负责取消分配它。相反,arrayWithCapacity已为您自动释放,即使您忘记取消分配也不会导致泄漏。
Cocoa使用某些命名约定。任何以alloc,new或copy开头的东西都会返回一个retainCount为1的东西,并且你需要释放它。函数返回的任何其他函数都有一个平衡的retainCount(它可能由其他东西持有,或者它可能会被保留并释放出来)。
所以:
NSMutableArray *removals = [NSMutableArray new];
keepCount为1,并且:
NSMutableArray *removals = [NSMutableArray arrayWithCapacity:99];
或
NSMutableArray *removals = [NSMutableArray array];
不要因为这些方法没有使用alloc,new或copy作为前缀。这些都在内存管理中明确说明文档。特别是:
如果您拥有对象的所有权 使用名称为的方法创建它 从<!>开头#8220; alloc <!>#8221;或<!>#8220;新<!>#8221;要么 包含<!>#8220;复制<!>#8221; (例如,alloc, newObject,或mutableCopy),或者如果你 发送一条保留信息。你是 负责放弃 您拥有的对象的所有权 释放或自动释放。任何其他时间 你收到一个物品,你绝对不能 释放它。