Автоматический подсчет ссылок путаницы - PullRequest
0 голосов
/ 27 ноября 2011

Я читал разные источники для автоматического подсчета ссылок, но не нашел ни одной замечательной статьи или документации, которые бы разъясняли мое понимание.Мое понимание ARC (автоматического подсчета ссылок) состоит в том, что он полностью берет на себя управление разработчиком по управлению памятью и назначает его компилятору для управления памятью.

Я правильно думаю?

Так ли этозначит сохранить, выпустить и авто-релиз больше не для iOS 5 SDK? Пример:

Допустим, я использую для создания объекта, подобного этому,

UIView *message = [[UIView alloc] initWithFrame:CGRectMake(0.0, 0.0, cell.frame.size.width, cell.frame.size.height)];
 message.tag = 0;
 [message addSubview:balloonView];
 [message addSubview:label];
 [cell.contentView addSubview:message];

 [balloonView release];
 [label release];
 [message release];

станет таким ЕСЛИ ДУГА ВКЛЮЧЕНА ,

UIView *message = [[UIView alloc] initWithFrame:CGRectMake(0.0, 0.0, cell.frame.size.width, cell.frame.size.height)];
 message.tag = 0;
 [message addSubview:balloonView];
 [message addSubview:label];
 [cell.contentView addSubview:message];

Любой вклад будет полезен, спасибо

Ура!

Ответы [ 3 ]

6 голосов
/ 27 ноября 2011

Да и нет:

Да, ARC избавляет вас от ручного вызова retain, release, autorelease, возможно, позволяет удалить довольно много ваших dealloc реализаций и - в новых средах выполнения - даже вводит обнуление слабых ссылок (w00t !), но это не предотвращает утечку, как таковую .

Это автоматическое сохранение / освобождение, а не сборщик мусора, поэтому он «позволяет» все еще пропускать память, создавая циклы сохранения.

Кроме того, он меняет ссылочную семантику атрибута __block с weak на strong:
Каждый фрагмент кода, где вы избежали захвата self с помощью __block id blockSelf = self;, теперь является потенциальной утечкой - к счастью, Clang стал еще лучше предупреждать вас о подобных проблемах.

Область, в которой ARC фактически заставляет вас писать на больше кода, чем прежде, в большинстве случаев, когда вы используете бесплатное соединение между CFTypeRef с и id <NSObject> с:
Приведения должны быть аннотированы, чтобы сообщить ARC, что делать, иначе вы получите ошибку компилятора.

Если вы работаете с простыми API-интерфейсами CF, ничего не изменится: все остается ручным.

Один из лучших ресурсов по ARC, который я нашел, - это выступление Криса Паркера на WWDC о внутренностях ARC. Если вы еще этого не видели, вам определенно следует проверить это - общая часть ARC начинается примерно через 8 минут, а детали начинаются примерно через 29 минут.

1 голос
/ 27 ноября 2011

Ваш пример кода правильный. ARC делает эти звонки для вас.

Однако ARC не «полностью захватывает» новичка, который все равно должен понимать управление памятью. Но, как говорит Apple, она позволяет вам сосредоточиться на владении объектом, а не сохранять счет.

Например, если вы не измените NSObject <Protocol> *_delegate; с помощью __weak или __unsafe_unretained, вы все равно создадите цикл сохранения.

0 голосов
/ 27 ноября 2011

Да, вы правы. ARC в значительной степени избавляет вас от необходимости управлять памятью, а компилятор справляется со всеми этими задачами. Расслабьтесь, расслабьтесь и больше беспокойтесь о написании необходимого кода, а не о тривиальных проблемах с управлением памятью:)

...