Ошибка modalViewController. самое странное, что я когда-либо встречал - PullRequest
2 голосов
/ 20 сентября 2009

Меня удивляет странная ошибка, с которой я сталкиваюсь в моей программе.

У меня есть tableViewController с navigationBar. Когда пользователь нажимает кнопку ADD на navigationBar, ему предоставляется модальное значение tableViewController. У этого viewController есть кнопка CANCEL на navigationBar (которая отклоняет viewController посредством делегирования)

В tableViewController имеются пользовательские ячейки, содержащие UIButton s, UITextField и UITextView.

Ошибка вызвана следующей последовательностью действий (и никаких других):

  • Я набираю некоторый текст в UITextView (который находится в одной из ячеек)
  • Не отпуская клавиатуру, я прокручиваю tableView вверх.
  • Я нажал кнопку отмены (так что контроллер модального вида закрывается)
  • Вернувшись на главную tableViewController, я снова нажимаю кнопку ADD,

Я получаю exec_bad_access ошибку.

Больше ничего не вызывает эту ошибку.

Если я попробую точно такую ​​же процедуру, но с UITextField, все будет хорошо.

Также, если я исключу какой-либо из перечисленных шагов из вышеуказанной последовательности, все будет хорошо.

Я в замешательстве. Может ли это быть ошибкой?


Обновление

Я пытался использовать NSZombie, чтобы выяснить причину ошибки. Вот что я вижу в консоли:

MyApp[14402:207] *** -[UIWebDocumentView isKindOfClass:]: message sent to deallocated instance 0x200a800

У меня нет большого кода для этого; ячейки создаются в конструкторе интерфейсов. Вот метод, который поднимает modalViewController

- (void)createNewEntry:(id)sender {

CreateNewEntryViewController *createNewEntryVC = [[CreateNewEntryViewController alloc] initWithNibName:@"CreateNewEntryViewController" bundle:nil];
createNewEntryVC.delegate = self;

UINavigationController *createNewEntryNavigationController = [[UINavigationController alloc] initWithRootViewController:createNewEntryVC];
[createNewEntryVC release];

[self presentModalViewController:createNewEntryNavigationController animated:YES];
[createNewEntryNavigationController release];   }

Ответы [ 7 ]

1 голос
/ 16 сентября 2010

В моем случае я использовал CustomTextView, как описано здесь: http://www.iphonedevsdk.com/forum/iphone-sdk-development/4864-adding-border-uitextview.html

Проблема в строке [backgroundImage release];. Это должно быть [myImageView release];

Я знаю, что это далеко от первоначального вопроса, но мой поиск привел меня сюда, так что, надеюсь, это поможет кому-то в будущем.

1 голос
/ 04 января 2011

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

1 голос
/ 21 октября 2009

У меня была такая же проблема (или одна очень похожая).

В моем случае произошел сбой, потому что я реализовал метод делегата UITextView textViewShouldEndEditing: всегда возвращать NO.

1 голос
/ 16 октября 2009

Окончательное редактирование:

Я нашел решение моей проблемы, возможно, оно решит и вашу. (Посмотрите на мой ответ на этот вопрос :) UIButton, созданный Interface Builder, аварийно завершает работу

В частности, если на ваших кнопках есть какие-либо изображения, попробуйте удалить их из проекта, получить свежие копии, переименовать их, повторно добавить их в проект, а затем снова подключить их. Кажется, сработало в моем случае.


Предыдущая случайность от меня:

(Не ответ, но ...) Для чего это стоит, я получаю похожее сообщение. Может быть, добавление того, что я вижу, поможет понять все это. Я получаю это как в симуляторе, так и на устройстве.

-[UIImage isKindOfClass:]: message sent to deallocated instance 0x1661f0

Это сообщение не всегда идентично для меня, иногда оно касается сохранения недопустимого экземпляра или нескольких других подобных вещей. Ничего из того, что я делаю сам, но за кулисами.

РЕДАКТИРОВАТЬ: Вот еще один:

-[UIImage retain]: message sent to deallocated instance 0x3b621a0

Вот код, куда меня выгружают (как и вы, я показываю модальное диалоговое окно, хотя у меня пользовательский UIView). В моем случае я заставляю цикл выполнения ждать ответа пользователя, подобного этому:

[modalDialog showInView:self.view
                  title:@"Illegal Move"
                message:message 
             cancelText:@"Cancel" 
            proceedText:@"Cheat"];

while (waitingForDialogToDismiss == YES) {
    //this line is where NSZombies puts me:
    [[NSRunLoop currentRunLoop] runMode: NSDefaultRunLoopMode 
                             beforeDate: [NSDate dateWithTimeIntervalSinceNow:1.5]];
}

Этот модальный диалог построен полностью из пера, имеет пару изображений кнопок и показывает правильно почти всегда. Однако, если я попытаюсь «спешить», коснувшись множества различных элементов пользовательского интерфейса, прежде чем он появится, я могу получить эту ошибку примерно в 30-40% случаев. В одном случае, даже если диалоговое окно появилось, его кнопка «Отмена» имела неправильный рисунок.

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

В данный момент я попытаюсь переписать кучу кода, чтобы удалить бизнес NSRunLoop. Посмотрим.

РЕДАКТИРОВАТЬ 2: без помощи

NSRunLoop определенно не был проблемой. Я сузил это намного больше и начал новый вопрос здесь: UIButton, созданный Интерфейсным Разработчиком, терпит крах

0 голосов
/ 11 октября 2010

Это также может произойти, если вы случайно вызвали [release release] в методе dealloc вашего модального контроллера. Ваш модальный контроллер выйдет, но вы столкнетесь с ошибкой сбоя доступа в родительском контроллере. Обычно вы используете что-то вроде:

@ свойство (неатомное, присваивать) идентификатор делегата;

Накройте это @synthesize в своей реализации, но не выпускайте его - ваш модальный VC не владеет копией.

0 голосов
/ 22 сентября 2009

Это определенно проблема управления памятью, как сказал coneybeare, очень вероятно, проблема с тем, как CreateNewEntryViewController освобождает свои объекты.

Вопросы:

  1. Что означает метод dealloc CreateNewEntryViewController look как?
  2. Почему вы создаете новый Экземпляр UINavigationController Вот? Звучит как твоя главная tableViewController уже находится в UINavigationController, зачем создавать новый здесь?
  3. Если вы пропустите 4-й шаг в своей последовательности действий (не нажимайте кнопку добавления снова, просто подождите после отмены контроллера модального представления), происходит ли сбой приложения?

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

Еще одна вещь, которую стоит продолжить, как уже было предложено, начать упрощать / комментировать код, пока он не заработает, а затем повторить ваши шаги. Возможно, начните удалять объекты из ваших файлов IB, оставьте пустым CreateNewEntryViewController с помощью только кнопки отмены, посмотрите, работает ли это.

0 голосов
/ 20 сентября 2009

В таких ситуациях я обычно начинаю комментировать код, пока он не перестанет ломаться. Тогда вы знаете, где проблема. Я бы начал с любых заявлений о выпуске, которые есть в CreateNewEntryViewController, даже тех, которые кажутся обыденными

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