3

Я знаю, что я предполагаю использовать:INIT] в автоматическом подсчете ссылок

ObjectClass *tmpObject = [[ObjectClass alloc] init]; 
realObject = tmpObject; 
[tmpObject release] 

инициализацию realObject (где realObject является объектом внутри класса)

Но теперь с режимом ARC, высвобождая является автоматический, мне все еще нужно использовать эту технику? Могу я просто использовать realObject = [[ObjectClass alloc] init];? Если нет, есть какая-то конкретная причина, по которой она протекает?

Благодаря

ответ

16

Как сказал Спенсер, если вы скомпилированы с включенным ARC, вы не можете позвонить release. Это ошибка, и компилятор позаботится об этом для вас.

Однако:

ObjectClass *tmpObject = [[ObjectClass alloc] init]; 
realObject = tmpObject; 
[tmpObject release] 

tmpObject в этом случае совершенно бессмысленно как ARC и вручную сохранить-релиз. И, фактически, в ручном удержании-выделении, вышеуказанный код немедленно освободит выделенный объект, в результате чего он будет освобожден (если ObjectClass внутренне не делает что-то нечетное), а realObject будет оставлен с висящим указателем.

I.e. этот код, как написано, вызовет сбой при первом обращении к сообщению realObject.

Для уточнения:

ObjectClass *tmpObject = [[ObjectClass alloc] init]; 
// tmpObject now contains a reference to an instance of ObjectClass; say, 0x12340 
realObject = tmpObject; 
// realObject now contains a reference to that same instance; realObject == 0x12340 
[tmpObject release] 
// this releases the object 
// both tmpObject and realObject now reference a deallocated object; much hilarity ensues.  

Для ARC, вы просто делаете это:

realObject = [[ObjectClass alloc] init]; 
+0

Спасибо, это ясное объяснение: D. –

+0

Я не понимаю, почему этот код не работает. Я просто прочитал образец кода, который имел: «SecondViewController * aSecondView = [[SecondViewController alloc] initWithNibName: @« SecondView »bundle: nil]; Разве это не то же самое? get temp object pointer и инициализировать то, что вы хотите, а затем установите указатель от реального объекта к инициированному материалу. Наконец, отпустите указатель временного объекта. [self setSecondViewController: aSecondView]; [выпуск aSecondView]; –

+0

В этом случае 'setSecondViewController:' сохранит 'aSecondView' (если внутренние детали реализации сочтут это необходимым - скорее всего, он сохранит, он может сделать что-то еще). – bbum

4

Если вы компилируете с -fobjc-дуговой (то есть, используя ARC), то вы не только не нужно вызывать release, это ошибка компилятора, если вы сделаете это. При использовании ARC задача компилятора заключается в вводе retain и release вызовов для вас.

+0

Так какой метод создания объекта является правильным (или лучше)? Должен ли я изменить все мои «realObject = [[ObjectClass alloc] init];»? –

+0

Создание объекта остается неизменным, IIRC. – Wevah

+0

Да - создание объекта остается неизменным, в коде нет только каких-либо сохранений/выпусков. Проблема, однако, в том, что код Тима взорван в первую очередь. – bbum

Смежные вопросы