Похоже, что основной проблемой здесь является неправильное понимание семантики владения объектами в Какао. Для каждого init
, copy
или retain
, вызванного на объекте, должен быть сделан вызов release
или autorelease
. Здесь происходит то, что вызов init
не соответствует вызову release
или autorelease
.
Я думаю, что здесь сбивает с толку то, что точечная нотация для назначения свойств является синтаксическим сахаром для вызова метода. Похоже, это просто присваивание, когда на самом деле это вызов метода установки свойств.
self.bla = [[SomeClass alloc] init];
- это не то же самое, что:
bla = [[SomeClass alloc] init];
Первое переводится как:
[self setBla: [[SomeClass] alloc] init]];
в то время как последний буквально является заданием.
Чтобы исправить вашу проблему, все, что вам действительно нужно сделать, - это убедиться, что код, вызывающий init
, вызывает autorelease
, так что счетчик удержаний будет уменьшен после вызова retain
установщиком.