【问题标题】:objective-c cant find memory leakObjective-C 找不到内存泄漏
【发布时间】:2010-11-23 15:30:32
【问题描述】:

我在自定义 nsobject 上映射一个 xml。

当用户点击重新加载时,再次调用该函数。

我在所有字符串上都有几个内存泄漏:

更新这是当前代码。

       - (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];
}

混合视频:

@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

也许有人可以帮我解决这个问题。

提前致谢 亚历克斯

【问题讨论】:

  • 顺便说一句,BOOL 应该是 YESNO,而不是 FALSE
  • 更正了这一点。不同的语言不同的布尔值;)
  • 你的-dealloc 方法是什么样的?

标签: objective-c memory-leaks nsmutablearray


【解决方案1】:
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];
}

或者类似的东西?

【讨论】:

  • 你是对的。整合了(见更新后),但我仍然有泄漏的字符串:(
【解决方案2】:

你们在哪里发布 mixesArr?

您还需要释放所有保留的字符串。

【讨论】:

  • 忘记了在 if(mixesArr != nil){} 中添加的那一行仍然在泄漏。
  • 在您的 MixVO 类中,您是否在 dealloc 中释放所有这些属性?运行 Instruments 是否指向更具体的东西?
  • 我知道 nsobject 的东西——不是字符串。
  • 由于您保留了属性声明中的字符串,您可能希望释放它们。
  • 谢谢!有道理 - 但我仍然得到泄漏的字符串。 (见原帖图片)
猜你喜欢
  • 2011-06-07
  • 1970-01-01
  • 1970-01-01
  • 2011-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多