нераспознанный селектор отправлен на экземпляр 0x5d18d60 ... я схожу с ума! - PullRequest
0 голосов
/ 09 августа 2010

Я схожу с ума от этого моего маленького приложения ... Пожалуйста, помогите мне !!!

это исходный код приложения: Smoking.zip

Сохраняет файл .dat только с NSMutableArray. Теперь, когда вы впервые запустите приложение, попробуйте иногда нажать кнопку сигареты: все должно работать нормально. Хорошо, теперь закройте приложение, снова откройте его и снова нажмите кнопку. На этот раз приложение завершится с ошибкой «нераспознанный селектор отправлен в экземпляр 0x5d18d60». Я был уверен, что проблема была в сохранении данных, потому что, когда я прокомментировал строку "[theData writeToFile: dataFilePath atomically: YES];" в методе «saveData» ошибка исчезла. Позже я обнаружил, что оно появляется снова, если я пытаюсь прочитать данные из NSMutableArray.

Пожалуйста, найдите время, чтобы проверить мой проект и помочь мне, потому что я схожу с ума от этого !!

Ответы [ 2 ]

1 голос
/ 09 августа 2010

Вы сумасшедший, потребовалось довольно много времени, чтобы найти эти строки:

Cig *oldCig = [mainDelegate.smokeArray lastObject];

...

[oldCig release];

Почему вы это делаете?Вы эффективно уменьшаете счетчик сохранности последнего объекта в массиве до 0. При сохранении он успешно сохраняется с нулевым счетом хранения.

При десериализации декодер сохранит любой (под)элемент, который он декодирует, так что счетчик сохранности этого последнего объекта будет на короткое время равным 1. Затем, при освобождении декодера, он освобождает все элементы, и poof переходит к последнему объекту Cig.При получении этого объекта из массива вы получаете указатель, указывающий на что-то совершенно другое, и приложение вылетает.

Вы должны прочитать об обработке памяти.lastObject просто возвращает указатель на объект в массиве, не сохраняя его для вас, поэтому вам не нужно его освобождать.Кроме того, для таких функций, как

- (NSArray *) quando

, попробуйте вернуть автоматически выпущенный массив, вызвав autorelease перед возвратом:

NSArray *newArray = [[[NSArray alloc] initWithObjects:year,...,nil] autorelease];

Тогда ваш другой код не должен думать о его освобождении.И выпустить dateFormatter.Все, что вы alloc, retain, copy или new, вы должны release или autorelease!

0 голосов
/ 09 августа 2010

легко.В SDK 3.2 и 4.0 вам нужно сделать так, чтобы ваши кнопки функционировали следующим образом.

// Note it takes one argument UIButton.
- (IBAction) smoke:(UIButton * ) button {

Измените это в вашем .h файле и .m файле, вам больше не нужно ничего менять.Работал на меня.

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