我是新来的记忆管理的码但我得到这个想法很好。

在把我的应用程序通过泄漏的工具,在模式时,我注意到的我只需要清理我的自定义的对象,但不是动态创建的阵例如,所以我想这些数据的类型是个-是有道理的,因为我只有释放阵列,我作为性能,有一个(保留)。

然后我发现了一些奇特:我得到一个泄漏在一定列初始化这样的:

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),或者如果你   发送一条保留信息。你是   负责放弃   您拥有的对象的所有权   释放或自动释放。任何其他时间   你收到一个物品,你绝对不能   释放它。

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