2012-03-01 3 views
0

У меня возникают утечки, если я не помещаю его в 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; 
    } 

Update Много вы говорите код является штраф, который является плюсом. Я не манипулирую events в другом месте. Я удалил любой код, который пытается попробовать и выделить краш. Возможно, это в родительском представлении?

Это событие щелчка, который толкает EventsViewController: - (Недействительными) eventsClick: (идентификатор) отправитель

{ 
    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

В этом коде нет ошибки. Пожалуйста, напишите больше своего кода. Возможно, вы изменяете события переменной-члена в другой точке кода? – calimarkus

+0

Соглашения о кодировании указывают, что только методы, возвращающие результаты в ссылочные параметры, должны иметь префикс «get». В противном случае возникает путаница. – zaph

+0

Как объявляется «событие», это свойство, если да, то укажите код. Кроме того, настоятельно рекомендуем использовать ARC. – zaph

ответ

-1

попытка положить

events = nil; 

в dealloc.

1

Рассматривали ли вы просто рефакторинг кода для использования ARC? Он работает с iOS 4 и выше и сделает вашу жизнь намного проще. Существует множество учебных пособий, которые помогут вам сделать это, и устранить необходимость вручную определять нюансы управления памятью.

+0

Эй, этот материал ARC выглядит неплохо. Я трачу слишком много времени, обворачиваю голову проблемы с управлением памятью. Спасибо за головы. – JonWells

0

Если объект Events имеет объект «объект», заданный как назначающий, то результаты stringWithUTF8String: не будут сохранены. (То же самое, если Events - объект C++.)

Метод stringWithUTF8String: возвращает автоматически выделенный объект, который будет выпущен при следующем повороте цикла события.

+0

Все объекты сохраняются в Event благодаря Walt – JonWells

0

Существует огромная разница, когда вы ссылаетесь на переменную через «я», а когда нет.

При использовании

events = [[self getEvents] retain]; 

память, выделенная в GetEvents никогда не будет находится в собственности класса и в основном утечка.

Вы должны использовать

self.events = [self getEvents]; // no need to use retain if property is correctly defined. 

Тогда

[events release]; 

должен работать нормально.

Смежные вопросы