Переменные экземпляра iOS 5

#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. Вставляет ли компилятор a copy ?

2. @StevenKramer: Нет. Прямой доступ к ivars всегда игнорирует семантику управления памятью свойства. Единственный раз, когда это имеет значение, — это то, что синтезированный ivar подберет слабую / сильную семантику свойства, из которого он синтезируется)

3. Спасибо за информацию, Кевин. Только что проверил это в отладчике. Я думаю, это немного странный, но понятный выбор.