繁体   English   中英

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

[英]will reassign a pointer cause memory leak?

我有以下代码,想知道当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;

没有泄漏,p1是一个自动释放的对象,在这种情况下,将p2分配给p1后,它们都只是指向同一对象。 p1指向的原始对象由自动释放池管理,并且在该池耗尽时将被释放。 不管是否为ARC,假设以后再发布p2都不会泄漏。

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

NSMutableArray *p1 = [NSMutableArray arrayWithCapacity:10];

返回一个自动释放的值。 您不需要释放此值。 但是,这个:

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

手动保留计数为1。完成后,您将需要释放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;

“ iOS正在收集分配的内存”-iOS从未具有垃圾回收功能。

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

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

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

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

顺便说一句,如果您将来有这样的问题,可以通过(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内存处理时,我发现这是一种简单但有用的诊断技术。

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

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

没有ARC:p1将泄漏。 要修复泄漏,您将需要

[p1 release];

在将p2的值分配给p1之前。 如果在释放该类之前不对这两个数组都调用release,则p2的内存也会泄漏。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM