2012-01-20 4 views
0

В одном из моих классов у меня есть метод -(id) init. Первое, что происходит в этом методе, - это вызов [super init]super init больше не работает

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

ошибки: Автоматическая выдачу подсчета ссылок: Результат делегатой инициализации вызова должен быть немедленно возвращен или передан «самость»

Почему происходящей эта ошибка? это потому, что это обесценивается в системе ARC? или что-то другое?

+2

Прочитать сообщение об ошибке. Это уже говорит вам очень четко, что не так и как это исправить. – fzwo

+0

@fzwo Мой вопрос был также почему он работал раньше. – SirYakalot

+0

Извините, что я не собираюсь выбирать, но это не то, что вы просили. Вы спросили, почему это происходит сейчас (ответ на сообщение об ошибке). (Опять же, мне жаль, что я столкнулся, как фасоль, но я думаю, что важно и вежливо попытаться рассказать о вопросах как можно яснее. Я бы не прокомментировал, читал ли ваш вопрос «Я вижу ошибку и имею уже исправил его, но мне любопытно, почему он работал до ».) – fzwo

ответ

3

Как вы это сделали со старой системой? Вы ожидаете (в обеих версиях)

self = [super init]; 

if (self) ... 

return self; 
+0

Старый путь был вашим путем, но без 'self ='. что именно делает это и почему он работал раньше? – SirYakalot

+0

'self' является указателем на объект, который строится в' init'. '[super init]' вызывает конструктор суперкласса и 'self = [super init]' назначает переменную self, чтобы указать на нее. Если вы просто напишете '[super init]', не указывая на 'self', он может все еще работать, потому что где-то в цепочке у вас, вероятно, будет' self = [super init] 'в любом случае ... но вы не должны этого допускать. Я думаю, они не рекомендовали это поведение с ARC. – vakio

+0

@vakio: «потому что где-то вверх по цепочке вы, вероятно, будете иметь self = [super init] в любом случае». Это неправильный ответ. 'self' - локальная переменная, а присвоение локальной переменной другим способом не имеет никакого эффекта. Вся причина, по которой 'self = [super init];' необходима, состоит в том, что 'init' может возвращать другой объект, кроме того, на который он был вызван (или' nil'). Если 'init' всегда возвращал объект, на который он был вызван, то просто' [super init]; 'было бы достаточно. Причина, по которой все еще работает, состоит в том, что 99% методов 'init' просто возвращают объект, на который он вызван. – newacct

1

Это работало до вас, потому что LLVM гораздо более строг, чем GCC. GCC не обнаружил ошибку и, как отметил @vakio в своем комментарии, он работал, потому что где-то в цепочке присутствовал self = [super init]. LLVM обнаруживает эту ошибку во время компиляции и препятствует компиляции неправильного кода.

0

Это сработало для меня:

необходимо назначить что-то в себе.

-(id) init { 
    self = [super init]; 
    return self; 
} 
Смежные вопросы