init] в автоматическом подсчете ссылок
Я знаю, что я должен использовать:
ObjectClass *tmpObject = [[ObjectClass alloc] init];
realObject = tmpObject;
[tmpObject release]
инициализировать realObject
(где realObject
это объект внутри класса)
Но теперь с режимом ARC, выпуск происходит автоматически, мне все еще нужно использовать эту технику? Могу ли я просто использовать realObject = [[ObjectClass alloc] init];
? Если нет, то есть ли какая-то конкретная причина, по которой он будет протекать?
Спасибо
2 ответа
Как сказал Спенсер, если вы компилируете с включенным ARC, вы не сможете вызвать release
совсем. Это ошибка, и компилятор позаботится об этом за вас.
Тем не мение:
ObjectClass *tmpObject = [[ObjectClass alloc] init];
realObject = tmpObject;
[tmpObject release]
tmpObject
в этом случае совершенно бессмысленно как для ARC, так и для ручного удержания-выпуска. И, фактически, в ручном удержании-релизе, приведенный выше код немедленно освобождает выделенный объект, вызывая его освобождение (если только ObjectClass
внутренне делает что-то странное) и realObject
останется с висящим указателем.
Т.е. этот код, как написано, вызовет сбой при первой попытке сообщения 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];
Если вы компилируете с -fobjc-arc (то есть, используете ARC), то вам не только не нужно вызывать release
, это ошибка компилятора, если вы делаете это. При использовании ARC задача компилятора - вставить retain
а также release
призывает вас.