Memory Management Headache-Collection of common programming errors

I get leaks if I dont put it in dealloc. I get a crash EXC_BAD_ACCESS If I do. I cannot see anything wrong with this code. The bad access is pointed at [events release]. Have I made a mistake in the code below or is Instruments just having a laugh at my expense?

events is an 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;
    }

Update A lot of you are saying the code is fine which is a plus. I dont manipulate events elsewhere – I have removed any code that does to try and single out the crash. Perhaps its in the parent view?

This is the click event that pushes the 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];
}

The crash is actually happening when I return to the parent view. (I think it is considered a parent in this scenario). But perhaps the [eventsViewController release] just triggers dealloc in the EventViewController.