ARC "Не безопасно удалить неиспользуемое сообщение об автоматическом выпуске" - PullRequest
2 голосов
/ 25 февраля 2012

При переходе на ARC я получил следующую ошибку компилятора: «Удалить неиспользуемое сообщение об автоматическом выпуске небезопасно».

Если я просто удалю сообщение об автоматическом выпуске, obj будет немедленно освобожден в конце getAutoreleasedObj, что приведет к падению printObj. Итак, как мне обработать автоматически выпущенный объект и преобразовать следующий код в ARC?

- (MyClass *) getAutoreleasedObj {
    MyClass *obj = [[MyClass alloc] init];
    [obj autorelease];
    return obj;
}

- (void) printObj {
NSLog(@"%@", [self getAutoreleasedObj];
}

Ответы [ 6 ]

5 голосов
/ 25 февраля 2012

Вам не нужно автоматически выпускать его, потому что он возвращается из функции, ARC неявно сделает его __autoreleasing и выпустит его для вас.

Этот код:

-(id) getAutoReleasedObject
{
    __autoreleasing MyClass *obj = [MyClass new];
    return obj;
}

Компилирует к этому:

-(id) getAutoReleasedObject 
{
    MyClass *obj = [MyClass new]; 
    return [obj autorelease];
}
3 голосов
/ 25 февраля 2012

Вы должны удалить звонок на autorelease:

- (MyClass *) getAutoreleasedObj {
    MyClass *obj = [[MyClass alloc] init];
    // [obj autorelease];
    return obj;
}

Метод printObj теперь эквивалентен следующему:

- (void) printObj {
    MyClass *obj = [self getAutoreleasedObj];
    // At his point there is a reference to obj
    NSLog(@"%@", obj);
    // There are no references to obj now, ARC will take care of it. 
}

Я имею в виду, что действительная ссылка на obj будет передана на NSLog, после этого никакой другой ссылки на obj.

не будет.
2 голосов
/ 25 февраля 2012

Вы сказали:

Если я просто удалю сообщение об автоматическом выпуске, obj будет немедленно освобожден в конце getAutoreleasedObj

Это неверно.Поскольку имя вашего метода (getAutoreleasedObj) не соответствует шаблону alloc / init / copy / mutableCopy / new, ARC автоматически предполагает, что вы хотите, чтобы obj был автоматически освобожден.

Вы не сливаете ни одинпул автоматического выпуска в конце getAutoreleasedObj, поэтому obj не будет выпущен.

Некоторый пул автоматического выпуска активен, когда ваш код выполняется.Если вы не настроили пул авто-релиза вручную, то активный пул будет создан в цикле выполнения Какао.Этот пул сливается в конце каждого прохода цикла выполнения.

Таким образом, если вы не настроили где-то свой собственный пул, объект, который вы создаете в getAutoreleasedObj, будет существовать до конца текущей итерации.цикла выполнения.

0 голосов
/ 02 августа 2012

Простой ответ на этот вопрос, который на самом деле не имеет ничего общего с ARC и фактически касается процесса перехода и перезаписи для преобразования в ARC, состоит в том, чтобы изменить последние две строки функции с:

[obj autorelease];
return obj;

до

return [obj autorelease];

Программа преобразования ARC сама по себе не разрешает [x autorelease], поскольку считает опасным, если на x больше нет ссылок.Таким образом, вы просто должны убедиться, что используете возвращаемое значение из [x autorelease], что легко сделать в случае с OP.

0 голосов
/ 27 февраля 2012

ARC определяет ваше семейство методов, чтобы определить, когда вставлять релиз.Методы, которые начинаются с init, copy, mutableCopy, new, принадлежат к семейству «init».ARC вставляет выпуск в вызывающий метод.В большинстве случаев вам не нужно возвращать автоматически освобожденный объект из метода.ARC разумно вставляет освобождение / удержание для вас.Вы можете переопределить это поведение, декорировав свой метод с помощью NS_RETURNS_RETAINED / NS_RETURNS_NON_RETAINED

Единственный случай, когда вам нужно автоматическое освобождение, это когда вы возвращаете данные с помощью указателя обратной записи.В вашем случае вы можете безопасно удалить авто-вызов.

0 голосов
/ 25 февраля 2012

Как уже упоминалось,

Вам не нужно autorelease в ARC.ARC будет заниматься выпуском всего для вас, так что вам не нужно об этом беспокоиться.В разделе «Обзор ARC»:

https://developer.apple.com/library/ios/#releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html

...