如果我不把它放在dealloc中,我就会泄漏。我遇到了崩溃EXC_BAD_ACCESS
如果我这样做了。我看不出这段代码有什么问题。错误的访问指向[events release]
。我是否在下面的代码中犯了一个错误,或者是乐器只是在笑我的费用?
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的click事件: - (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]
只会在dealloc
中触发EventViewController
。
答案 0 :(得分:1)
您是否考虑过重构代码以使用ARC?它适用于iOS 4及更高版本,将使您的生活更轻松。有很多教程可以指导您如何操作,并且无需手动找出内存管理的细微差别。
答案 1 :(得分:0)
如果您的Events对象将属性'subject'设置为assign,则不会保留stringWithUTF8String:的结果。 (如果Events是C ++对象,则相同。)
stringWithUTF8String:方法返回一个自动释放的对象,该对象将在下一轮事件循环中释放。
答案 2 :(得分:0)
当您通过“self”引用变量时,以及当您不引用变量时,存在巨大差异。
使用时
events = [[self getEvents] retain];
getEvents中分配的内存永远不会存储在class属性中,基本上是泄漏。
您需要使用
self.events = [self getEvents]; // no need to use retain if property is correctly defined.
然后
[events release];
应该可以正常工作。
答案 3 :(得分:-1)
尝试放
events = nil;
在dealloc中。