【发布时间】:2012-03-01 16:37:34
【问题描述】:
如果我不把它放在 dealloc 中,我会得到泄漏。如果我这样做,我会崩溃EXC_BAD_ACCESS。我看不出这段代码有什么问题。错误访问指向[events release]。是我在下面的代码中犯了一个错误,还是 Instruments 只是在嘲笑我的付出?
events 是NSArray
@interface EventsViewController : UITableViewController
{
@private
NSArray *events;
}
- (void)viewDidLoad
{
events = [[self getEvents] retain];
}
- (void)dealloc
{
[events release];
[super dealloc];
}
- (NSArray*)getEvents
{
NSMutableArray *response = [[[NSMutableArray alloc] init] autorelease];
//Some sql
while(sqlite3_step(statement) == SQLITE_ROW)
{
Event *event = [[[Event alloc] init] autorelease];
event.subject = [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 0)];
[response addObject:event];
}
return response;
}
更新
你们中的很多人都说代码很好,这是一个优点。我不会在其他地方操纵events - 我已经删除了任何试图找出崩溃的代码。也许它在父视图中?
这是推送EventsViewController的点击事件: - (void)eventsClick:(id)sender
{
EventsViewController *eventsViewController = [[EventsViewController alloc] initWithNibName:@"EventsViewController" bundle:nil];
eventsViewController.anywhereConnection = anywhereConnection;
eventsViewController.contact = contact;
[[self navigationController] pushViewController:eventsViewController animated:YES];
[eventsViewController release];
}
当我返回父视图时,崩溃实际上正在发生。 (我认为在这种情况下它被认为是父母)。但也许[eventsViewController release] 只是在EventViewController 中触发dealloc。
【问题讨论】:
-
该代码没有错误。请发布更多您的代码.. 可能您在代码的另一点更改了成员变量事件?
-
编码约定指定只有返回结果与引用参数的方法才能具有前缀“get”。否则会导致混乱。
-
events是如何声明的,它是一个属性,如果是,请提供代码。另外,强烈考虑使用 ARC。 -
events 不是一个属性,只是一个变量。关于“get”的好点是我懒惰的。我会发布更多代码。
-
您是否尝试启用 NSZombies ?
标签: iphone ios memory-management memory-leaks