问题描述
|
任何能够帮助重新获得此代码泄漏对象来源的人:
我的应用程序编译没有任何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
不是其他类型的吗?