Использование ключевого слова сору
Не важно, какой мультфильм студии Pixar вы выберете для просмотра, но если вы стукнете по кнопке раскрытия, то детализированное сообщение появится в том же самом представлении контроллера DisclosureDetailController. Если бы мы использовали для управления нашими обновлениями метод viewDidLoad, это представление обновилось бы только при первом появлении представления класса DisclosureDetailController. При выборе второго мультфильма студии Pixar мы бы по-прежнему увидели детализированное сообщение, оставшееся от выбора первого мультфильма, — и в этом нет ничего хорошего. Поскольку метод viewWillAppear: вызывается каждый раз, когда должно отображаться представление, мы с удовольствием используем этот метод для нашего обновления.
Возвращаясь к объявлениям свойств, мы можем отметить, что свойство для строки jssagp объявляется с использованием ключевого слова сору, а не retain. Что это значит?
Почему это мы должны копировать строки? Оказывается, причина лежит в потенциальном существовании изменяемых строк.
Предположим, мы объявили свойство message с использованием ключевого слова retain, и тогда любой внешний код, переданный экземпляру класса NSMutableString, сможет установить значение свойства message. Если этот исходный вызывающий код позже решит изменить содержимое этой строки, то экземпляр класса DisclosureDetailController перейдет в неопределенное состояние, когда значение строки message и значение, отображаемое в текстовом поле, не будут совпадать! Использование ключевого слова сору исключает этот риск, поскольку в результате сору-вызова для любой переменной типа NSString (включая изменяемые подклассы) мы всегда получим неизменяемую копию. Кроме того, в этом случае нам не придется серьезно беспокоиться о влиянии на быстродействие. Оказывается, отправка копии любому неизменяемому экземпляру строки не означает реальное копирование этой строки. Вместо этого мы получим в качестве возвращаемого значения тот же самый строковый объект (естественно, после инкрементирования его счетчика ссылок). По сути, результат использования атрибута доступа сору для неизменяемой строки не отличается от использования атрибута retain, и этот результат нас вполне устраивает во всех случаях, поскольку объект никогда не может измениться.
Добавьте в файл DisclosureDetailController.it, следующий код.
- Дата: 9-12-2014, 21:31