簡體   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