此代码泄漏对象的来源是什么?

问题描述

| 任何能够帮助重新获得此代码泄漏对象来源的人: 我的应用程序编译没有任何ANALYZE问题。当我运行PROFILER并查看“内存泄漏”时,我看到泄漏出现了。这些泄漏之一是在我的WeekendEvent对象中。根据下面的方法,仪器中有3个“泄漏块”行项目(我在代码中已指出了这些行指向的行): 内存分配+1 保留+2 发行+1 问题-我认为这意味着有释放,但是泄漏的来源是什么。单击工具突出显示的代码段如下。在我看来,这样还可以: 我创建的WeekendEvent传递给addWeekendEvent方法后释放 在addWeekendEvent中,它只是将其添加到NSMutableArray中,因此我认为该安排对其包含的对象进行任何内存管理 我也确实在dealloc中释放了NSMutableArray 关键源代码位和主要内容
// ------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];
}
编辑:一些其他代码重新创建/使用上述\“ week \”变量的方式-因此在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 \”实例,Instruments会在其\“泄漏对象\”栏中突出显示该实例。以防万一这还不清楚。 编辑3-重新设置项目变量的方式-关键代码位是:
@interface Weekends : NSObject {
    NSMutableArray* _items;
}
@property (nonatomic,retain) NSMutableArray* items;

@synthesize items = _items;
- (void) dealloc {
    [_items release];
    [super dealloc];
}
    

解决方法

假设您的
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
不是其他类型的吗?     

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...