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 призывает вас.

Другие вопросы по тегам