泄漏点在哪里?
Posted
技术标签:
【中文标题】泄漏点在哪里?【英文标题】:Where is the leak? 【发布时间】:2010-12-08 15:46:33 【问题描述】:仪器告诉我这段代码有泄漏。但是,我很确定我稍后会发布它。谁能告诉我这里发生了什么?
- (void) addReminderEntry
DataEntryController* item = [[DataEntryController alloc] initWithEntryType:REMINDER]; // it says that the leak was instantiated here
item.delegate = self;
[[self navigationController] pushViewController:item animated:YES];
[item setEditing:YES animated:YES];
[item release];// this is the place I release it
谢谢
【问题讨论】:
您没有提供足够的信息。首先,什么是“提醒”?其次,您没有包含 initWithEntryType: 代码或 Instruments 明确表示泄露的对象类型(它肯定是 DataEntryController 实例吗?)。 1. REMINDER 是一个枚举,所以它不应该是泄漏的原因。 2. 是的,Instruments 说它肯定是 DataEntryController 实例。感谢您的回复。 【参考方案1】:这很可能与未在 DataEntryController 类中发布的内容有关。确保您在该类中释放所有属性/等。
【讨论】:
【参考方案2】:Leaks 只告诉你内存分配的位置,它不能告诉你的是应该从哪里开始释放它的代码!
也就是说,您制作了一个视图控制器,并且在您完成后它仍然在内存中。是的,您在该代码中发布了 VC,但只有在您展示它之后 - 这意味着导航控制器保留了它,可能还有其他东西。只有在调用最终版本时才会释放它。
视图控制器没有被释放的主要原因通常是让视图控制器将自己设置为它保留的东西的委托,然后在视图控制器离开屏幕时不撤消它。如果您的视图控制器是保留它的东西的委托,它永远不会被释放。
【讨论】:
例如如果DataEntryController
的委托被定义为retain
属性而不是assign
,它将泄漏。
谢谢大家。这是一个很棒的信息。我不知道这个!【参考方案3】:
原来是这个构造函数造成的:
- (DataEntryController*) initWithEntryType:(DataType) eType
DataEntryController* item = [[DataEntryController alloc] init];//<- here
item.entryType = eType;
item.allowEdit = YES;
return item;
显然 ios 为每个带有初始“init”的构造函数添加了 retain 1。
切换到后效果很好:
DataEntryController* item = [super init];
【讨论】:
以上是关于泄漏点在哪里?的主要内容,如果未能解决你的问题,请参考以下文章