[英]iphone: How to solve NSArray memory Leak?
我正在發布NSArray和NSMutableArray,但它顯示內存泄漏。 而ZoneData代碼是這樣的
-(ZoneData*) initWithZoneName:(NSString *)zoneNameIn SdName:(NSString *)sdNameIn eCount:(NSString *)eCountIn iCount:(NSString *)iCountIn StandLat:(NSString *)standLatIn StandLong:(NSString *)standLongIn
{
self = [super init];
if (self)
{
zoneName = [zoneNameIn copy];
lsdName = [sdNameIn copy];
leCount = [eCountIn intValue];
liCount = [iCountIn intValue];
standLat = [standLatIn copy];
standLong = [standLongIn copy];
}
return self;
}
如何解決呢?
問題是您的實例變量。 在-init
,您正在正確地將它們分配給數組中字符串的副本。 但是,您還需要在-dealloc
釋放它們。
-(void) dealloc
{
[zoneName release];
[lsdName release];
[standLat release];
[standLong release];
[super dealloc];
}
現在,您可能會問為什么泄漏工具告訴您泄漏是在其中使用字符串而不是init方法創建NSArray
地方。 原因是針對不可變對象的-copy
優化了,除了將保留發送給self
之外,什么也不做。 因此,您擁有作為實例變量的那些副本實際上是與-componentsSeparatedByString:
創建的對象相同的對象-componentsSeparatedByString:
componentsSeparatedByString:
返回一個自動釋放的NSArray
。 您不應該自己釋放它,但是最接近的NSAutoreleasePool
將為您做到這一點。 在第61行中,您過度釋放了數組。
如果您在執行循環時擔心內存使用情況,則可以在每次循環中清除自動釋放的對象:
for (...)
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
// your loop contents.
[pool drain];
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.