#iphone #ios #ios5 #automatic-ref-counting
#iPhone #iOS #ios5 #автоматический подсчет ссылок
Вопрос:
Я немного смущен тем, как работает ARC, я знаю, что существует автоматический подсчет ссылок, но работает ли эта функция даже для назначения необработанных переменных экземпляра (без использования свойств).
Например, если у меня есть переменная экземпляра arr
:
@interface TestClass : NSObject {
NSArray *arr;
}
Теперь, если внутри метода я назначаю это с помощью автоматического освобождения NSArray
:
- (IBAction)test {
arr = [NSArray arrayWithObject:@"TEST"];
}
Что происходит с этим массивом? Он просто волшебным образом сохраняет его до arr
тех пор, пока не будет переназначен на что-то другое?
Теперь, если я сделаю что-то вроде:
self.arr = [NSArray arrayWithObject:@"TEST"];
Что произойдет, если он сильный или слабый?
Комментарии:
1. Я бы рекомендовал прочитать документ Apple Transitioning to ARC Release Notes .
2. И для удобства: developer.apple.com/library/ios/#releasenotes/ObjectiveC /…
Ответ №1:
Да, ARC работает с необработанным доступом к ivar. Так же, как и локальные переменные, переменные ivar являются неявными __strong
, если они не оформлены с __weak
помощью или __unsafe_unretained
. Поэтому по умолчанию они будут действовать как свойство, которое было отмечено strong
(или retain
, которое в ARC является синонимом strong
).
Комментарии:
1. Кевин, что произойдет с
@synthesize
общим свойством сcopy
семантикой, если вы получите прямой доступ к синтезированному ivar. Вставляет ли компилятор acopy
?2. @StevenKramer: Нет. Прямой доступ к ivars всегда игнорирует семантику управления памятью свойства. Единственный раз, когда это имеет значение, — это то, что синтезированный ivar подберет слабую / сильную семантику свойства, из которого он синтезируется)
3. Спасибо за информацию, Кевин. Только что проверил это в отладчике. Я думаю, это немного странный, но понятный выбор.