В чем разница между слабыми и сильными атрибутами установщика свойств в Objective-C?
@property(retain, [weak/strong]) __attribute__((NSObject)) CFDictionaryRef myDictionary;
Какое влияние и польза?
Я слышал, что weak недоступен в iOS 4, и нам нужно использовать assign.
Слабо похоже назначить?
Ответы:
У вас либо включен или выключен ARC для определенного файла. Если он включен, вы не можете использовать и
retain
release
autorelease
т.д ... Вместо этого вы используетеstrong
weak
для свойств или__strong
__weak
для переменных (по умолчанию__strong
). Сильный эквивалентно сохранению, однако ARC сделает выпуск за вас.Единственный раз, когда вы захотите использовать weak, - это если вы хотите избежать циклов сохранения (например, родительский элемент сохраняет дочерний элемент, а дочерний элемент сохраняет родительский элемент, поэтому ни один из них никогда не освобождается).
Часть «бесплатное соединение» (преобразование из
NS
вCF
) немного сложна. Вам по-прежнему придется вручную управлятьCFRelease()
иCFRetain()
для CF-объектов. Когда вы конвертируете их обратно в объекты NS, вы должны сообщить компилятору о счетчике сохранения, чтобы он знал, что вы сделали.Все здесь .
источник
Вот информация, которую я знаю о свойствах переменных
так что ниже есть подробная ссылка на статью, где вы можете найти вышеупомянутые все атрибуты, которые демонстративно вам помогут. Большое спасибо всем, кто дает здесь лучшие ответы !!
01. strong (iOS4 = сохранить) - он говорит: «Держите это в куче, пока я не перестану указывать на это» - другими словами «Я владелец, вы не можете освободить это до того, как прицельтесь, отлично с тем же самым «- Используйте сильный только в том случае, если вам нужно удержать предмет. - По умолчанию все переменные экземпляра и локальные переменные являются сильными указателями. - Обычно мы используем strong для UIViewControllers (родителей элемента пользовательского интерфейса) - strong используется с ARC и в основном помогает вам, не беспокоясь о счетчике сохраненных объектов. ARC автоматически освобождает его, когда вы закончите с ним. Использование ключевого слова strong означает, что объект принадлежит вам.
Пример:
02. weak (iOS4 = unsafe_unrehibited) - он говорит: « Сохраняйте это, пока кто-то другой указывает на это сильно» - то же самое, что присваивать, не сохранять или освобождать - «Слабая» ссылка - это ссылка, которую вы не сохраняете. - Обычно мы используем weak для IBOutlets (дочерние элементы UIViewController). Это работает, потому что дочерний объект должен существовать только до тех пор, пока существует родительский объект. - слабая ссылка - это ссылка, которая не защищает объект, на который указывает ссылка, от сбора сборщиком мусора. - Слабое, по сути, присвоенное, несохраняемое свойство. За исключением случая, когда объект освобождается, слабый указатель автоматически устанавливается на ноль
Пример :
Объясните : Спасибо Би Джей Гомеру
Представьте, что наш объект - собака, и собака хочет убежать (быть освобожденной). Сильные указатели похожи на поводок для собаки. Пока собака привязана к поводку, она не убежит. Если пять человек прикрепят поводок к одной собаке (пять сильных указателей на один объект), то собака не убежит, пока не будут сняты все пять поводков. С другой стороны, слабые указатели похожи на маленьких детей, указывающих на собаку и говорящих: «Смотри! Собака!» Пока собака все еще на поводке, маленькие дети все еще видят собаку и будут указывать на нее. Однако как только все поводки отсоединены, собака убегает, сколько бы на нее ни указывали маленькие дети. Как только последний сильный указатель (привязка) больше не указывает на объект, объект будет освобожден, а все слабые указатели будут обнулены. Когда мы используем слабый? Единственный случай, когда вы захотите использовать weak, - это если вы хотите избежать циклов сохранения (например, родительский элемент сохраняет дочерний элемент, а дочерний элемент сохраняет родительский элемент, поэтому ни один из них никогда не освобождается).
источник
strong=retain
иassign
помечены как значения по умолчанию, но не может быть обоих одновременно.weak
иstrong
в своих примерах. Разве не было бы больше смысла в том, что родительский элемент имеетstrong
ссылки на своих дочернихmyButton
элементов (как свойствоUIViewController
класса, которым вы указалиweak
), и что дети сохраняютweak
ссылки на своего родителя (например,viewController
свойство дочернего класса, которое вы вместо этого он установлен наstrong
). Например, читая книгу Мэтта Нойбурга,iOS 7 Programming Fundamentals
он показывает, что класс, объявляющий своего делегата как свойство, будет сохранять его `слабым ', что кажется справедливым.Чтобы вызвать те части документов, на которые ссылается Роберт, которые явно отвечают на ваши последние два вопроса:
Это называется слабым опорным сигналом обнуления. Вы можете создавать слабые ссылки, которые не обнуляют слабые ссылки, используя __unsafe_unrehibited, но, как следует из названия, это обычно не рекомендуется.
Также в документации:
источник
__unsafe_unretained
это версия ARCassign
.Совершенно ясное использование свойства WEAK заключается в следующем:
источник
давайте возьмем пример, чтобы уточнить детали (приведенный выше ответ уже хорош), пусть этот пример поможет немного больше
пусть у нас есть два класса A и B
приведенный выше код сгенерирует цикл сохранения, потому что оба являются строгим типом a --------> b ---------> a
поэтому, чтобы избежать этого, вы должны использовать свойство week одного из них, чтобы он еженедельно ссылался на объект и не увеличивал его количество ссылок.
источник