Мой предыдущий анализ был не совсем верным.
Однако я хочу отметить, что эта проблема может возникать с разными классами. Это на самом деле зависит от того, к какому классу вы относитесь. Создание подклассов NSObject не является проблемой, но, например, создание подклассов NSOperation, NSOperationQueue и NSThread.
И это происходит потому, что, как и ВЫ, классы, которые вы подклассируете, могут распределять вещи в своем методе -init
. И это также, где вы устанавливаете nil
переменные, которые вы еще не распределили (и могут сделать это позже в вашем коде).
Таким образом, вызывая -release
для себя без предыдущего -init
, вы можете заставить один из ваших родительских классов освободить объект, который он не выделил. И они не могут проверить, является ли их объект nil
, потому что у него даже не было возможности инициировать каждый объект / значение, в котором он нуждается.
Это также может быть причиной того, что выпуск NSOperation без init работал на 10.5 и не работает на 10.6. Реализация 10.6 была переписана для использования блоков и Grand Central Dispatch, и поэтому их методы init
и dealloc
могли бы сильно измениться, что привело бы к другому поведению в этом фрагменте кода.