Я проверил это еще несколько раз, и, кажется, три условия для этой конкретной причуды, чтобы показать.
В моем конкретном случае значение ивара Protocol
также было таким же, как что из содержащего класса. Это, кажется, является дополнительным требованием для этой проблемы, чтобы всплыть (ссылаясь здесь на мой предыдущий ответ, который не упоминал об этом).
Итак, уточним мой предыдущий ответ. Если
initXXX
является иваром - типа
id
типа - , который реализует
Protocol
, который является таким же , как содержащий класс
, затем компилятор Objective- C + AR C успешно скомпилирует код, но не сможет его выполнить.
Вот пример кода Раньше я тестировал
@interface Dog : NSObject < Animal >
@property (nonatomic,strong) id < Animal > initState;
@end
Примерно так могут возникнуть проблемы просто потому, что имя начинается с init . Измените имя, и все проблемы исчезнут.
Для справки, сгенерированная ошибка времени выполнения:
Объект Dog перевыпущен при освобождении
Этот фрагмент довольно абстрактно, но это может укусить вас в тех местах, где вам нужно указать какое-то начальное условие и где естественно назвать какой-то ivar initXxx
, но будьте осторожны, если вы используете Objective- C, у вас нет такой роскоши, как и компилятор предупреждаю вас, что это неправильно.
Первоначальная ошибка казалась связанной с выделением памяти и заставила меня подозревать, как я использовал autoreleasepool , но теперь я совершенно уверен, что это не имеет ничего общего с выпуск.