我有以下代码,并想知道当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;
答案 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的内存也会泄漏。