dug*_*gla 4 cocoa-touch objective-c nsmutablearray
这是我正在编写的一些代码的要点.我担心我没有正确解决NSMutableArray上数组类方法的保留/释放问题.以下是否实际泄漏记忆?
for(a while) {
// do stuff
NSMutableArray *a = nil;
// do stuff
if (!a) {
a = [NSMutableArray array];
}
} // for(a while)
Run Code Online (Sandbox Code Playgroud)
Rya*_*aig 12
您不会在此代码中泄漏内存,并且在运行循环结束时自动释放阵列时,自己释放阵列将导致崩溃.
大多数Cocoa类提供了几种创建新对象的方法,并且与此约定非常一致:
[[NSSomeObject alloc] init] :您负责释放对象(实例方法).
[NSSomeObject someObject]:对象将为您自动释放,通常在运行循环结束时(类方法).它大致相当于[[[NSSomeObject alloc] init] autorelease].
正确使用实例方法将是:
a = [[NSMutableArray alloc] init];
// do stuff
[a release];
Run Code Online (Sandbox Code Playgroud)
正确使用类方法将是:
a = [NSMutableArray array];
// do stuff, array is in the autorelease pool
Run Code Online (Sandbox Code Playgroud)
请注意,Apple建议您尽可能远离便捷方法以提高性能.这是有争议的建议,可能不会节省太多的处理器时间,并将alloc-init从发布中分离出来,您可能实际上并不关心保留.
来自Cocoa Memory Managment Rules:
如果使用名称以"alloc"或"new"开头或包含"copy"(例如,alloc,newObject或mutableCopy)的方法创建对象,或者向其发送保留消息,则获取对象的所有权.您有责任使用release或autorelease放弃您拥有的对象的所有权.在收到对象的任何其他时间,您不得释放它.
因此有了这条线:
a = [NSMutableArray array];
Run Code Online (Sandbox Code Playgroud)
你没有获得数组的所有权,它将被传递给你自动释放.内存将由自动释放池自动处理,一旦不再使用,它将为您释放.但是,如果要将数组保留在当前事件之外,则必须保留它,否则它将为您释放.
| 归档时间: |
|
| 查看次数: |
2880 次 |
| 最近记录: |