将重新分配指针导致内存泄漏?

时间:2012-08-14 14:57:29

标签: ios memory-management memory-leaks autorelease

我有以下代码,并想知道当iOS重新收集已分配的内存时会发生什么。内存p1是否会指向后来自动释放,虽然它现在指向不同的内存?并且内存p2也指向自动释放,因为p1在语义上意味着在开始时指向自动释放的内存?

NSMutableArray *p1 = [NSMutableArray arrayWithCapacity:10];
NSMutableArray *p2 = [[NSMutableArray alloc] init];

// what will happen to the memory p1 and p2 point to
// after the following assignment, and at later stage?
p1 = p2;

5 个答案:

答案 0 :(得分:5)

没有任何东西会被泄露,p1是一个自动释放的对象,在这种情况下,在将p2分配给p1之后,它们都只是指向同一个对象。 p1指向的原始对象由自动释放池管理,并在池耗尽时释放。是否ARC,假设您稍后释放p2,则没有泄漏。

答案 1 :(得分:1)

在ARC下,您无需执行任何操作。两个对象都将被释放。 ARC之外:

NSMutableArray *p1 = [NSMutableArray arrayWithCapacity:10];

返回自动重新标记的值。您无需释放此值。但是,这个:

NSMutableArray *p2 = [[NSMutableArray alloc] init];

手动保留计数为1.完成后,您需要释放p2的值(然后分配给p1)。

答案 2 :(得分:1)

NSMutableArray *p1 = [NSMutableArray arrayWithCapacity:10];
NSMutableArray *p2 = [[NSMutableArray alloc] init];

// what will happen to the memory p1 and p2 point to
// after the following assignment, and at later stage?
p1 = p2;

“iOS正在重新收集已分配的内存” - iOS从未拥有垃圾收集功能。

p1是指向自动释放对象的指针。

p2是指向非自动释放对象的指针(您或ARC必须稍后释放它以避免内存泄漏)

在p1 = p2之后,p1指向p2指向的非自动释放对象。原始对象p1指向此处是孤立的。

如果您使用ARC功能,则无需执行任何操作。在手动内存管理环境下,执行[p2 release];[p1 release];以平衡释放您拥有的已分配对象。

答案 3 :(得分:1)

顺便说一句,如果你将来遇到这样的问题,可以通过(a)对所讨论的类进行子类化来轻松测试; (b)添加记录释放的自己的dealloc。例如:

@interface TestNSMutableArray : NSMutableArray
@end

@implementation TestNSMutableArray
- (void)dealloc
{
    [super dealloc]; // only needed for non-ARC
    NSLog("%s", __FUNCTION__);
}
@end

然后使用TestNSMutableArray而不是NSMutableArray来尝试您的代码。如果你看到dealloc,那就很好。如果没有,你就是在泄漏。

显然你也可以使用Instruments,但是当我第一次接触Objective-C内存处理时,我发现这是一种简单但有用的诊断技术。

答案 4 :(得分:-1)

首先,这取决于您是否使用ARC。

使用ARC: 不会有内存泄漏。操作系统将释放p1的内存,现在数组将指向与p2相同的位置。然后,当p1和p2消失时(例如,当类被释放时),操作系统将释放两个阵列的内存。

没有ARC: p1将被泄露。要修复泄漏,你需要

[p1 release];

在将p2的值赋给p1之前。如果在取消分配类之前没有在这两个数组上调用release,那么p2的内存也会泄漏。