Как сказал Спенсер, если вы скомпилированы с включенным 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];
Спасибо, это ясное объяснение: D. –
Я не понимаю, почему этот код не работает. Я просто прочитал образец кода, который имел: «SecondViewController * aSecondView = [[SecondViewController alloc] initWithNibName: @« SecondView »bundle: nil]; Разве это не то же самое? get temp object pointer и инициализировать то, что вы хотите, а затем установите указатель от реального объекта к инициированному материалу. Наконец, отпустите указатель временного объекта. [self setSecondViewController: aSecondView]; [выпуск aSecondView]; –
В этом случае 'setSecondViewController:' сохранит 'aSecondView' (если внутренние детали реализации сочтут это необходимым - скорее всего, он сохранит, он может сделать что-то еще). – bbum