[英]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.