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

 

strong, retain

Эта стратегия выбирается по умолчанию. Оба термина являются полными синонимами друг друга и могут употребляться в прикладном коде как с поддержкой механизма ARC, так и без его поддержки. Термин retain унаследован из периода, предшествовавшего появлению механизма ARC. При действующем механизме ARC сама переменная экземпляра становится обычной (строгой) ссылкой, и когда ей, так или иначе, будет присвоено значение, механизм ARC сохранит входящее значение и освободит из памяти существующее значение этой переменной экземпляра. Если механизм ARC не действует, то метод установки сохранит входящее значение и освободит из памяти существующее значение переменной экземпляра.

сору

Эта стратегия подобна стратегии strong или retain, за исключением того, что метод доступа копирует входящее значение переменной экземпляра, посылая ей сообщение сору, а копия с уже увеличенным подсчетом сохраняемых ссылок присваивается переменной экземпляра. Такая стратегия особенно пригодна в том случае, если у неизменяемого класса имеется изменяемый подкласс (например, NSString и NSMutableString или NSArray и NSMutableArray) и требуется предотвратить передачу из кода, вызывающего метод установки, объект изменяемого подкласса. В соответствии с принципом полиморфизма (см. главу 5) это вполне допустимо в коде, вызывающем метод установки, поскольку там, где ожидается экземпляр класса, может быть также передан экземпляр его подкласса. Однако при вызове метода сору создается экземпляр неизменяемого класса (см. главу 10), что препятствует вызывающему коду сохранить ссылку на входящее значение и в дальнейшем видоизменить его без вашего ведома.

weak

При действующем механизме ARC переменная экземпляра становится слабой ссылкой. Механизм ARC присвоит ей входящее значение, не сохраняя его, а также незаметно установит в ней пустое значение, если экземпляр, на который она ссылается, прекратит свое существование. Как пояснялось ранее в этой главе, такая стратегия удобна для защиты от возможного возникновения цикла сохранения или для сокращения издержек, когда заранее известно, что управление памятью не требуется, как это происходит с интерфейсным объектом, который уже сохранен своим родительским представлением. Метод установки может быть синтезирован только при действующем механизме ARC. Несмотря на то что применять стратегию weak в коде без поддержки механизма ARC теоретически возможно, на практике это вряд ли стоит делать.

assign

Эта стратегия унаследована из периода, предшествовавшего появлению механизма ARC, и применяется таким же образом, как и стратегия weak. Метод установки не управляет памятью, а входящее значение непосредственно присваивается переменной экземпляра. В этом случае переменная экземпляра не становится слабой ссылкой с поддержкой механизма ARC, и в ней не устанавливается автоматически пустое значение, если экземпляр, на который она ссылается, прекращает свое существование. Она оказывается слабой ссылкой без поддержки механизма ARC ( unsafe_unretained) и в конечном итоге может стать висячим указателем.

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


 

 

 

Добавить комментарий