Управление памятью с помощью Gesture Recognizer - PullRequest
0 голосов
/ 16 июля 2011

Многие мои утечки памяти происходят от этого кода, который распознает пролистывания. Что я делаю неправильно? Первая строка - это то, что, как мне кажется, подтекает (используя инструменты). Он показывается как ответственный за множество ошибок Это в ViewDidLoad:

   UISwipeGestureRecognizer *swipeRight = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeRightAction:)];
    [(UISwipeGestureRecognizer *)swipeRight setNumberOfTouchesRequired:2];

    swipeRight.direction = UISwipeGestureRecognizerDirectionRight;
    swipeRight.delegate = self;
    [webView addGestureRecognizer:swipeRight];

    UISwipeGestureRecognizer *swipeLeft = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeLeftAction:)];
    [(UISwipeGestureRecognizer *)swipeLeft setNumberOfTouchesRequired:2];
    swipeLeft.direction = UISwipeGestureRecognizerDirectionLeft;
    swipeLeft.delegate = self;
    [webView addGestureRecognizer:swipeLeft];

    // Do any additional setup after loading the view from its nib.

}

Еще один вопрос, что может вызвать зомби здесь? Должен ли я быть авто-релиз?

    AViewController *a = [[AViewController alloc]init];
[self.navigationController pushViewController:a animated:YES];

a.title =@"A View";
[a release];

Обновление 3: я запустил инструменты для поиска плохих распределений, и при некотором интенсивном использовании я получаю зомби: Сообщение об ошибке: An Objective-C message was sent to a deallocated object (zombie) at address: 0xf583270. В инструментах вот что я вижу. Инструменты выделяют эту линию и имеют 100% рядом с ней.

AViewController *a = [[AViewController alloc]init];

Ответы [ 3 ]

4 голосов
/ 16 июля 2011

Вы выделяете / инициализируете UISwipeGestureRecognizer (что делает его задачей выпустить его), а не выпускать его в верхнем фрагменте кода, дважды. вам нужно добавить [swipeRight release]; и [swipeLeft release]; после того, как вы добавили их в свое веб-представление.

1 голос
/ 16 июля 2011

После добавления жеста в ваши представления вызовите для него метод release, поскольку этот жест сохраняется в представлениях , в которые вы добавляете.

Как ниже

 [webView addGestureRecognizer:swipeRight];  
    [swipeRight release];

И

 [webView addGestureRecognizer:swipeLeft];  
    [swipeLeft release];
0 голосов
/ 16 июля 2011

Управление памятью в object-c - это то, что тоже требует некоторого привыкания.Я лично позволил оператору справиться со всем за меня.Это означает, что каждый раз, когда я что-то выделяю, я просто делаю это с автоматическим выпуском.ОС будет обрабатывать релиз для меня, когда это необходимо.Единственный раз, когда возникает проблема, это когда вы повторно используете объект в той же области, ОС отправит ему слишком много выпусков и освободит память, прежде чем вы захотите это тоже.Вот пример

//This code will result in a memory crash
CustomObject *coolThing = [[[CustomObject alloc] init] autorelease];
[coolThing setAwesomeLevel:10];
[array addObject:coolThing];

[coolThing setAwesomeLevel:7];
[array2 addObject:coolThing];

Вместо этого вы бы использовали

//Working code
CustomObject *coolThing = [[CustomObject alloc] init];
[coolThing setAwesomeLevel:10];
[array addObject:coolThing];

[coolThing setAwesomeLevel:7];
[array2 addObject:coolThing];

[coolThing release];

Теперь, чтобы использовать авторелизы с вашим кодом, все, что вам нужно сделать, это добавить их в allocs.Вот почему ваш код протекает.Когда вы добавляете его в объект webView, он увеличивает свою учетную запись.И когда вы покидаете эту область, он имеет учетную запись хранения 2, но вы отправляете ему только один выпуск (его сохранение останется на 1 и никогда не освободит память).

UISwipeGestureRecognizer *swipeRight = [[[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeRightAction:)] autorelease];
[(UISwipeGestureRecognizer *)swipeRight setNumberOfTouchesRequired:2];

swipeRight.direction = UISwipeGestureRecognizerDirectionRight;
swipeRight.delegate = self;
[webView addGestureRecognizer:swipeRight];

UISwipeGestureRecognizer *swipeLeft = [[[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeLeftAction:)] autorelease];
[(UISwipeGestureRecognizer *)swipeLeft setNumberOfTouchesRequired:2];
swipeLeft.direction = UISwipeGestureRecognizerDirectionLeft;
swipeLeft.delegate = self;
[webView addGestureRecognizer:swipeLeft];

, если вы это сделаетеесли вы не хотите использовать автоматическое освобождение, просто добавьте несколько выпусков после добавления жестов в веб-представление.

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