这段代码的漏洞对象的来源是什么?

时间:2011-05-25 02:51:51

标签: iphone objective-c memory-management memory-leaks instruments

任何人都能够帮助解决此代码的漏洞对象的来源:

我的应用程序编译时没有任何ANALYZE问题。当我运行PROFILER并查看内存泄漏时,我看到泄漏。其中一个泄漏发生在我的WeekendEvent对象中。每个仪器中有3个泄漏块行项目(我在代码中注明了这些项目指出):

  • Malloc +1
  • 保留+2
  • 发布+1

问题 - 我认为这意味着有一个版本,但是这个泄漏会从哪里发生。点击乐器高亮显示的代码片段如下。对我来说似乎没问题:

  1. WeekendEvent我在传入addWeekendEvent方法
  2. 后创建我发布
  3. 在addWeekendEvent中它只是将它添加到NSMutableArray中,因此我认为该安排对它包含的对象进行任何内存管理
  4. 我确实在dealloc中发布了NSMutableArray
  5. 主要源代码位&什么机构亮点

    // ------Weekends Method (plural)-----
    WeekendEvent *weEvent = [[WeekendEvent alloc] init]; // [INSTRUMENTS - 87.5%]
    [week addWeekendEvent:weEvent];                      // [INSTRUMENTS - 12.5%]
    [weEvent release];                  
    
    
    //------Weekend *.h ------------
    @interface Weekend : NSObject {
        NSMutableArray*     _events;     
    }
    - (void)addWeekendEvent:(WeekendEvent*)weEvent;
    @property (nonatomic, retain) NSMutableArray* events;
    @end
    
    
    //------Weekend *.m -------------
    - (void)addWeekendEvent:(WeekendEvent*)weEvent {
        [self.events addObject:weEvent];
    }
    - (void) dealloc {
        [_events release];
        [super dealloc];
    }
    

    编辑:一些额外的代码是如何创建/使用上面的“周”变量的 - 所以在Weekends方法中我发布的代码在for循环中 - 显示for循环的代码因此是:

    for (Weekend *week in self.items) {
       // do pass "week.start" to some methods (which is an NSDate) - don't think this would be relevant though?
       WeekendEvent *weEvent = [[WeekendEvent alloc] init]; // [INSTRUMENTS - 87.5%]
       [week addWeekendEvent:weEvent];                      // [INSTRUMENTS - 12.5%]
       [weEvent release];   
    }               
    // Note - self.items I checked is "released" in the dealloc method
    

    编辑2 - 为了确认,这是一个“WeekendEvent”实例,仪器在其“泄漏对象”列中突出显示。以防这一点不明确。

    编辑3 - 重新设置项目变量 - 关键代码位是:

    @interface Weekends : NSObject {
        NSMutableArray* _items;
    }
    @property (nonatomic, retain) NSMutableArray* items;
    
    @synthesize items = _items;
    - (void) dealloc {
        [_items release];
        [super dealloc];
    }
    

1 个答案:

答案 0 :(得分:1)

您显示的代码中的内存管理是正确的,假设您的Weekend类的其余部分看起来像这样:

@synthesize events = _events;

- (id)init {
    if ((self = [super init]) == nil) { return nil; }
    _events = [[NSMutableArray alloc] initWithCapacity:0];
    return self;
}

此外,仪器结果与您的所有代码匹配:

Malloc  +1  ==  WeekendEvent *weEvent = [[WeekendEvent alloc] init];
Retain  +2  ==  [week addWeekendEvent:weEvent];
Release +1  ==  [weEvent release];

基于该逻辑,最可能的候选者是您的week对象未正确发布。您没有显示解释其创建方式的代码,但我注意到您发布帖子的代码是针对Weekend类的。您确定week的类型不同吗?