objc_msgSend () сообщение об ошибке, почему? - PullRequest
2 голосов
/ 28 сентября 2010

Я получил сообщение об ошибке «objc_msgSend ()» в моем приложении и благодаря Hamster Emporium я могу немного понять, что происходит.

Теперь я нашел «проблему» и «решение», но чего я не могу понять, почему моя проблема действительно была проблемой.

Вот сценарий:

Object_A -> Object_B -> Object_C

Символ '->' представляет действие "создать". Класс Object_C выглядит так:

@interface Class_C {
  NSArray *items;
}
@property (nonatomic, retain) NSArray *tems;
@end

Свойство 'items' устанавливается в Object_B с помощью метода setItems:

- (void)setItems:(NSArray *)items_ {
 if (object_B) {
  [object_B.taskItems release];
  object_B.taskItems = items_;
 }
 [super setItems:items_];
}

Теперь, если я использую этот метод как есть, я получаю богохульную ошибку 'objc_msgSend ()', НО, если я комментирую строку выпуска, все идет хорошо.

Примечание: retainCount в строке выпуска равно 0, но выпуск выполняется без проблем

Ответы [ 3 ]

2 голосов
/ 28 сентября 2010

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

Эта строка:

object_B.taskItems = items;

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

Очень хорошее общее правило для управления памятью Какао состоит в том, что вам следует только release объект, если высоздал его (либо по alloc / init, либо по копии).Выпуск object_B.taskItems нарушит это правило.

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

Хм, вау. ок.

object_B.taskItems = items_;

- это то же самое, что

[object_B setTastItems: items_];

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

Помните, что свойства не совпадают с элементами в Objective-C. Свойства - это методы, которые обращаются к закрытым членам класса (и делают причудливые вещи вроде retain/release и @synchronized).

0 голосов
/ 31 января 2014

У меня была похожая проблема, но в моем случае это был сценарий:

Я создал контроллер, который регистрирует себя для прослушивания изменений в атрибуте NSOperation "isFinished", в то время как NSOperation работал мой контроллерушел, когда NSOperation закончил и попытался уведомить:

[self willChangeValueForKey:@"isFinished"];

Я получил

objc_msgSend() corrupt cache error

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

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