2011-02-08 9 views
0

私はそれを手に入れません! インスツルメンツはリークはどこですか?

-(void)loadData 
{ 
    if (locationData != nil) { 
     [locationData release]; 
    } 

self.locationData = [[NSMutableArray alloc] init]; 

NSData *recievedData = [NSData dataWithContentsOfURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://htmlwin001.******.net/blutalkasp/locations2.asp?uid=%@&von=%d&bis=%d", [[UIDevice currentDevice] uniqueIdentifier], von, bis]]]; 

NSString *recievedString = [[NSString alloc] initWithData:recievedData encoding:NSUTF8StringEncoding]; 

SBJsonParser *json = [[SBJsonParser alloc] init]; 
NSMutableDictionary *jsonData = [json objectWithString : recievedString]; 

NSString *tmpLocationData; 
for (NSDictionary *location in [jsonData objectForKey:@"items"]) { 
    Location *newLocation = [[Location alloc] init]; 
    tmpLocationData = [[NSString alloc]initWithFormat:@"%@", [location objectForKey:@"id"]]; 
    [newLocation setLocationID:tmpLocationData]; 
    [tmpLocationData release]; 
    tmpLocationData = [[NSString alloc]initWithFormat:@"%@", [[location objectForKey:@"locationname"] gtm_stringByUnescapingFromHTML]]; 
    [newLocation setLocationName:tmpLocationData]; 
    [tmpLocationData release]; 
    tmpLocationData = [[NSString alloc]initWithFormat:@"%@",[location objectForKey:@"locationdistance"]]; 
    [newLocation setLocationDistance:tmpLocationData]; 
    [tmpLocationData release]; 
    tmpLocationData = [[NSString alloc]initWithFormat:@"%@", [[location objectForKey:@"locationaddress"] gtm_stringByUnescapingFromHTML]]; 
    [newLocation setLocationAdress:tmpLocationData]; 
    [tmpLocationData release]; 
    tmpLocationData = [[NSString alloc]initWithFormat:@"%@", [[location objectForKey:@"locationdescription"] gtm_stringByUnescapingFromHTML]]; 
    [newLocation setLocationDescription:tmpLocationData]; 
    [tmpLocationData release]; 

    NSNumber *tmpLocationLat = [[NSNumber alloc] initWithInteger:[[location objectForKey:@"locationlatitude"]integerValue]]; 
    [newLocation setLocationPositionLat:tmpLocationLat]; 
    [tmpLocationLat release]; 

    NSNumber *tmpLocationLng = [[NSNumber alloc] initWithInteger:[[location objectForKey:@"locationlongitude"]integerValue]]; 
    [newLocation setLocationPositionLng:tmpLocationLng]; 
    [tmpLocationLng release]; 

    NSString *URL; 
    URL = [location objectForKey:@"locationimage1"]; 
    URL = [URL stringByReplacingOccurrencesOfString:@"[SLASH]" withString:@"/"]; 
    NSString *tmpUrl1 = [[NSString alloc]initWithFormat:@"http://htmlwin001.******.net/blutalkasp/locationimages/data/%@", URL]; 
    [newLocation setLocationImageURL1:tmpUrl1]; 
    [tmpUrl1 release]; 

    URL = [location objectForKey:@"locationimage2"]; 
    URL = [URL stringByReplacingOccurrencesOfString:@"[SLASH]" withString:@"/"]; 
    NSString *tmpUrl2 = [[NSString alloc]initWithFormat:@"http://htmlwin001.******.net/blutalkasp/locationimages/data/%@", URL]; 
    [newLocation setLocationImageURL2:tmpUrl2]; 
    [tmpUrl2 release]; 

    URL = [location objectForKey:@"locationimage3"]; 
    URL = [URL stringByReplacingOccurrencesOfString:@"[SLASH]" withString:@"/"]; 
    NSString *tmpUrl3 = [[NSString alloc]initWithFormat:@"http://htmlwin001.******.net/blutalkasp/locationimages/data/%@", URL]; 
    [newLocation setLocationImageURL3:tmpUrl3]; //Leak geschlossen 
    [tmpUrl3 release]; 

    [self.locationData addObject:newLocation]; 

    [newLocation release]; 
} 
[recievedString release]; 
[json release]; 

} 

はそれが[nsdictionaryobject objectForKey:@"xy"];が漏れを起こしている可能性がある私は、この方法では、リークを示していますか?

特に計器ではこれらの線が着色されているためです。ご覧のとおり、私はすべてをリリースしていました。 私はそのアプリに絶望的です。私は便利なコンストラクタをalloc/init/release(例えば、stringWithFormatではなくinitWithFormat)で置き換え始めました。特にループ内で!

しかし、時々楽器がクラッシュすることもあります。プロパティlocationDataは、あなたが次の行にメモリリークを作成している保持するように設定されている場合は

答えて

3
if (locationData != nil) { 
     [locationData release]; 
    } 


self.locationData = [[NSMutableArray alloc] init]; 

このパターンは致命的です。インスタンス変数を直接解放して、潜在的にぶら下がっているポインタを残してから、setメソッドで値を代入します(ドット構文を使用して)。

setメソッドは、最初にlocationDataを解放しようとします。

Joeが示したように、クラッシュしない唯一の理由は、まずlocationDataを上書き保持しているということです。

-deallocの外には、self.locationData = nil;を使用して、インスタンス変数を解放し、nilします。

+0

あなたのアドバイスをお試しさせていただきます。しかし、このプロジェクトの対象となった顧客に問題があったので、もう急いではありません。しかし、私は客観的なことについてもっと学ぶためにこのコードを書いています。私はこのことについて良い本が必要だと思う。 –

3

//This is what is probably leaking 
self.locationData = [[NSMutableArray alloc] init]; 
//Change that to 
self.locationData = [[[NSMutableArray alloc] init] autorelease]; 

編集:次の行

とあなたのための新しい問題を導入することができる

//Remove this check to release locationData because the property will properly 
//handle memory management for you just by setting it 
if (locationData != nil) { 
    [locationData release]; 
} 
+0

**ありがとうございました** –

+0

変更後に 'EXC_BAD_ACCESS'を実行する場合に備えて、いくつかの追加情報を追加しました。 – Joe

+0

はい、私はこれらの行をコメントアウトしています。私は、この種のMutableArraysを持つohterメソッドを持っています。私はこれを削除すると同じ方法でそれらを変更していますif(arrData!= nil){ [arrData release]; } ' –

関連する問題