任何人都能够帮助解决此代码的漏洞对象的来源:
我的应用程序编译时没有任何ANALYZE问题。当我运行PROFILER并查看内存泄漏时,我看到泄漏。其中一个泄漏发生在我的WeekendEvent对象中。每个仪器中有3个泄漏块行项目(我在代码中注明了这些项目指出):
问题 - 我认为这意味着有一个版本,但是这个泄漏会从哪里发生。点击乐器高亮显示的代码片段如下。对我来说似乎没问题:
主要源代码位&什么机构亮点
// ------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];
}
答案 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
的类型不同吗?