内存管理头痛

时间:2012-03-01 16:37:34

标签: iphone ios memory-management memory-leaks

如果我不把它放在dealloc中,我就会泄漏。我遇到了崩溃EXC_BAD_ACCESS如果我这样做了。我看不出这段代码有什么问题。错误的访问指向[events release]。我是否在下面的代码中犯了一个错误,或者是乐器只是在笑我的费用?

eventsNSArray

@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

4 个答案:

答案 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中。