Головная боль управления памятью - PullRequest
0 голосов
/ 01 марта 2012

Я получаю утечки, если я не помещу это в 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] просто вызывает dealloc в EventViewController.

Ответы [ 4 ]

1 голос
/ 01 марта 2012

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

0 голосов
/ 02 марта 2012

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

Когда вы используете

events = [[self getEvents] retain];

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

Вам нужно использовать

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

Тогда

[events release]; 

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

0 голосов
/ 01 марта 2012

попробуйте поставить

events = nil; 

в Deloloc.

0 голосов
/ 01 марта 2012

Если для вашего объекта Events свойство 'subject' установлено в качестве assign, результаты stringWithUTF8String: не будут сохранены.(То же самое, если Events является объектом C ++.)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...