target-c не может найти утечку памяти - PullRequest
0 голосов
/ 23 ноября 2010

я сопоставляю xml с пользовательским объектом nsobject.

когда пользователь нажимает перезагрузить, функция вызывается снова.

я получаю несколько утечек памяти во всех строках: alt text

ОБНОВЛЕНИЕ это текущий код.

       - (void)mapDataOnModel
{
    if(mixesArr != nil)
    {
        //[mixesArr release];
        [mixesArr removeAllObjects];
        [playListArr removeAllObjects];
    }
    else 
    {
        mixesArr = [[NSMutableArray alloc]init];    
        playListArr = [[NSMutableArray alloc] init];        
    }


    MixVO *tmpMix;  
    AudioVO *tmpAudio;  

    for (DDXMLElement *node in nodes) 
    {
        tmpMix = [[MixVO alloc] init];

        tmpMix.uuid = [[node attributeForName:@"uuid"] stringValue];
        tmpMix.name = [[[node elementsForName:@"name"] objectAtIndex:0] stringValue];       
        tmpMix.artist = [[[node elementsForName:@"artist"] objectAtIndex:0] stringValue];
        tmpMix.path = [[[node elementsForName:@"file"] objectAtIndex:0] stringValue];   
        tmpMix.headline = [[[node elementsForName:@"headline"] objectAtIndex:0] stringValue];
        tmpMix.teaser = [[[node elementsForName:@"teaser"] objectAtIndex:0] stringValue];
        tmpMix.copy = [[[node elementsForName:@"copy"] objectAtIndex:0] stringValue];
        tmpMix.isHighlight = NO;


        NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
        [dateFormat setDateFormat:@"HH:mm:ss"]; 
        tmpMix.duration = [dateFormat dateFromString:[[[node elementsForName:@"duration"] objectAtIndex:0] stringValue]] ;
        [dateFormat release];


        // CHECK IF IT IS A HIGHLIGHT MIX
        for (int i = 0; i < [[highlightsNode elementsForName:@"member"] count]; i++) 
        {
            NSString *highlightID;
            highlightID = [[[highlightsNode elementsForName:@"member"] objectAtIndex:i] stringValue] ;
            if([tmpMix.uuid isEqualToString:highlightID])
            {
                tmpMix.isHighlight = YES;
            }
        }


        if([[node elementsForName:@"image_standard"] count] > 0)
            tmpMix.image_standard = [[[node elementsForName:@"image_standard"] objectAtIndex:0] stringValue]  ;

        if([[node elementsForName:@"image_artist"] count] > 0)
            tmpMix.image_artist = [[[node elementsForName:@"image_artist"] objectAtIndex:0] stringValue]  ;

        if([[node elementsForName:@"image_teaser"] count] > 0)
            tmpMix.image_teaser = [[[node elementsForName:@"image_teaser"] objectAtIndex:0] stringValue]  ;

        if([[node elementsForName:@"image_player"] count] > 0)
            tmpMix.image_player = [[[node elementsForName:@"image_player"] objectAtIndex:0] stringValue]  ;         


        /*
        tmpAudio = [[AudioVO alloc] init];
        tmpAudio.file = tmpMix.path;
        NSString *tmpDuration;
        tmpDuration = [[[node elementsForName:@"duration"] objectAtIndex:0] stringValue];
        tmpAudio.duration = tmpDuration;

        // PARSE TRACKS
        NSArray *track = NULL;
        track = [node elementsForName:@"tracks"];       

        DDXMLElement *trackElems = [track objectAtIndex:0];

        NSArray *tracks = NULL;
        tracks = [trackElems elementsForName:@"track"];     


        NSMutableArray *tracksArray;
        tracksArray = [[NSMutableArray alloc]init];         



        TrackVO *tmpTrack;      

        for (DDXMLElement *node2 in tracks) 
        {
            tmpTrack = [[TrackVO alloc] init];
            tmpTrack.timecode = [[node2 attributeForName:@"timecode"] stringValue];
            tmpTrack.name = [node2 stringValue];
            [tracksArray addObject:tmpTrack];
            [tmpTrack release];
        }       


        tmpAudio.tracksArr = tracksArray;
        [tracksArray release];

        tmpMix.audioVO = tmpAudio;
        [tmpAudio release];
        */
        [mixesArr addObject:tmpMix];
        [tmpMix release];
    }

    // SORT PROGRAMM

/*

    NSSortDescriptor *lastDescriptor =
    [[[NSSortDescriptor alloc]
      initWithKey:@"artist"
      ascending:YES
      selector:@selector(localizedCaseInsensitiveCompare:)] autorelease];   

    NSArray * descriptors =
    [NSArray arrayWithObjects:lastDescriptor, nil];


    NSArray * sortedArray = [mixesArr sortedArrayUsingDescriptors:descriptors];         
    //[mixesArr release];


    mixesArr = [[NSMutableArray alloc]initWithArray:sortedArray];

    // PARSE PLAYLIST


    for (DDXMLElement *node in nodesPl) 
    {
        SchedVO *tmpSched;
        tmpSched = [[SchedVO alloc] init];
        NSString *timeStr;
        timeStr = [[node attributeForName:@"timestamp"] stringValue];
        tmpSched.date = [NSDate dateWithTimeIntervalSince1970:timeStr.intValue];
        tmpSched.uid = [node stringValue];
        [playListArr addObject:tmpSched];
        //[tmpSched release];
    }

*/
    [self updateDone];
}

MixVO:

@interface MixVO : NSObject 
{
    NSString    *uuid;
    NSString    *name;
    NSString    *artist;    
    NSString    *path;      
    NSString    *headline;      
    NSString    *teaser;        
    NSString    *copy;      
    NSString    *image_standard;
    NSString    *image_artist;
    NSString    *image_teaser;
    NSString    *image_player;
    NSDate      *duration;
    AudioVO     *audioVO;
    BOOL        isHighlight;    

}

@property (nonatomic,retain) NSString *uuid;
@property (nonatomic,retain) NSString *name;
@property (nonatomic,retain) NSString *artist;
@property (nonatomic,retain) NSString *path;
@property (nonatomic,retain) NSString *headline;
@property (nonatomic,retain) NSString *teaser;
@property (nonatomic,retain) NSString *copy;
@property (nonatomic,retain) NSString *image_standard;
@property (nonatomic,retain) NSString *image_artist;
@property (nonatomic,retain) NSString *image_teaser;
@property (nonatomic,retain) NSString *image_player;
@property (nonatomic,retain) NSDate *duration;
@property (nonatomic,retain) AudioVO *audioVO;
@property BOOL isHighlight;

@end

Может быть, кто-то может помочь мне с этим.

спасибо заранее Alex

Ответы [ 2 ]

1 голос
/ 23 ноября 2010
if(mixesArr != nil)
{
    [mixesArr removeAllObjects];
    [playListArr removeAllObjects];
}

mixesArr = [[NSMutableArray alloc]init];

Это говорит о том, что mixesArr уже может быть выделен, и вы просто выделяете новый экземпляр, делая исходный mixesArr висящим указателем.

Если вы не напишите что-то вроде:

if(mixesArr != nil)
{
    [mixesArr removeAllObjects];
    [playListArr removeAllObjects];
}
else {
    mixesArr = [[NSMutableArray alloc]init];
}

Или что-то похожее?

0 голосов
/ 23 ноября 2010

Где вы выпускаете mixesArr?

Вы также захотите освободить все сохраненные строки.

...