init] в автоматическом подсчете ссылок - PullRequest
3 голосов
/ 26 июня 2011

Я знаю, что я должен использовать:

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

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

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

Спасибо

Ответы [ 2 ]

16 голосов
/ 26 июня 2011

Как сказал Спенсер, если вы компилируете с включенным 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];
4 голосов
/ 26 июня 2011

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

...