Как кто-то, кто плохо знаком с Objective-C, может ли кто-нибудь дать мне обзор сохранения, назначения, копирования и любых других, которые мне не хватает, которые следуют директиве @property? Что они делают и почему я хочу использовать один поверх другого?
ios
objective-c
iphone
memory-management
Марк Рейд
источник
источник
Ответы:
Статья, на которую ссылается MrMage, больше не работает. Итак, вот что я узнал из моего (очень) короткого времени программирования в Objective-C:
nonatomic vs. atomic - по умолчанию используется "atomic". Всегда используйте «неатомные». Я не знаю почему, но в книге, которую я прочитал, сказано, что есть «редко» причина использовать «атомарный». (Кстати: книга, которую я прочитал - это книга BNR "Программирование на iOS".)
readwrite против readonly - «readwrite» используется по умолчанию. Когда вы @synthesize, для вас будут созданы и геттер, и сеттер. Если вы используете «только чтение», сеттер не будет создан. Используйте его для значения, которое вы не хотите изменять после создания экземпляра объекта.
сохранить против копирования против присвоения
источник
atomic
так же плохо, как советоватьnonatomic
. Ни один из вариантов не является «правильным», поэтому разработчики языка выбрали более безопасное из двух решений. На самом деле,nonatomic
как правило, это лучший выбор, поскольку он исключает чрезвычайно дорогие блокировки потоков. Единственная причина для использованияatomic
- если ваше свойство может быть установлено из нескольких потоков (в этом случае его пропуск может привести к перерасходу или утечке).Прежде чем вы узнаете об атрибутах @property, вы должны знать, что такое @property.
@property предлагает способ определить информацию, которую класс должен инкапсулировать. Если вы объявите объект / переменную с помощью @property , то этот объект / переменная будет доступен для других классов, импортирующих его класс.
Если вы объявляете объект с помощью @property в заголовочном файле, то вы должны синтезировать его с помощью @synthesize в файле реализации. Это делает объект KVC-совместимым . По умолчанию компилятор синтезирует методы доступа для этого объекта.
Методы доступа: сеттер и геттер.
Пример: .h
.m
Теперь компилятор будет синтезировать методы доступа для имени .
Список атрибутов @property
атомарный, неатомный, сохранить, скопировать, только для чтения, перезаписать, назначить, сильный, getter = метод, setter = метод, unsafe_unretained
атомарное поведение по умолчанию. Если объект объявлен как атомарный, он становится потокобезопасным. Потокобезопасный означает, что одновременно только один поток конкретного экземпляра этого класса может иметь контроль над этим объектом.
Если поток выполняет метод получения, тогда другой поток не может выполнить метод установки для этого объекта. Это медленно.
По этой причине доступ к неатомарному свойству быстрее, чем к атомарному.
Метод setter увеличивает количество сохраняемых объектов, так что он будет занимать память в пуле авто-релиза.
Даже если изменяемая строка установлена и впоследствии изменена, экземпляр захватывает любое значение, которое он имеет во время его установки. Методы получения и получения не будут синтезированы.
сейчас,
имя останется без изменений.
Компилятор будет генерировать геттер, но не сеттер.
Это противоположно только для чтения.
Имейте в виду, что функции сохранения и назначения в принципе взаимозаменяемы, когда включена сборка мусора.
Это идет с ARC.
В случае логических свойств (свойств, имеющих значение YES или NO), метод getter обычно начинается со слова «is»
Метод должен заканчиваться двоеточием.
Небезопасная ссылка похожа на слабую ссылку в том, что она не поддерживает связанный объект, но для него не будет установлено значение nil, если целевой объект освобожден.
Если вам нужно указать несколько атрибутов, просто включите их в список через запятую, например так:
источник
@property
в заголовочном файле, то вы должны синтезировать его, используя@synthesize
в файле реализации». Не всегда. Например: «По умолчаниюreadwrite
свойство будет поддерживаться переменной экземпляра, которая снова будет автоматически синтезироваться компилятором». Из док .Прочитав много статей, я решил собрать всю информацию об атрибутах:
Ниже приведена ссылка на подробную статью, где вы можете найти эти атрибуты.
Большое спасибо всем людям, которые дают лучшие ответы здесь!
Вот пример описания из статьи
Пример :
Пример:
Объясните:
Предположим, что есть атомарное строковое свойство с именем «name», и если вы вызываете [self setName: @ «A»] из потока A, вызываете [self setName: @ "B»] из потока B и вызываете [self name] из поток C, тогда все операции в другом потоке будут выполняться последовательно, что означает, что если один поток выполняет установщик или получатель, то другие потоки будут ожидать. Это делает свойство «name» доступным для чтения / записи, но если другой поток D одновременно вызывает [name release], то эта операция может привести к сбою, так как здесь нет никакого вызова setter / getter. Это означает, что объект является безопасным для чтения / записи (ATOMIC), но не потокобезопасным, поскольку другие потоки могут одновременно отправлять объекту сообщения любого типа. Разработчик должен обеспечить безопасность потоков для таких объектов.
Если свойство "name" было неатомичным, то все потоки в приведенном выше примере - A, B, C и D будут выполняться одновременно, что приведет к непредсказуемому результату. В случае атомарного, любой из A, B или C будет выполняться первым, но D все еще может выполняться параллельно.
Пример:
Пример :
Сильное и слабое объяснение, благодаря BJ Homer :
Представьте, что наш объект - собака, и что собака хочет убежать (быть освобожденной). Сильные указатели похожи на поводок на собаку. Пока вы привязали поводок к собаке, собака не убежит. Если пять человек прикрепят поводок к одной собаке (пять сильных указателей на один объект), то собака не убежит, пока все пять поводков не отсоединятся. Слабые указатели, с другой стороны, похожи на маленьких детей, указывающих на собаку и говорящих "Смотри! Собака!" Пока собака все еще на поводке, маленькие дети все еще могут видеть собаку, и они все еще будут указывать на нее. Однако, как только поводки отстегнуты, собака убегает независимо от того, сколько на нее указывают маленькие дети. Как только последний сильный указатель (поводок) перестанет указывать на объект, объект будет освобожден, а все слабые указатели будут обнулены. Когда мы используем слабые? Единственный раз, когда вы захотите использовать слабый, - это если вы хотите избежать циклов сохранения (например, родитель сохраняет ребенка, а ребенок сохраняет родителя, поэтому ни один из них никогда не освобождается).
Пример:
Пример:
unsafe_unretained
-unsafe_unretained - квалификатор владения, который сообщает ARC, как вставлять вызовы сохранения / освобождения. -unsafe_unretained - это версия ARC назначения.
Пример:
Пример:
источник
Атомарное свойство может быть доступно только одному потоку за раз. Это потокобезопасно . По умолчанию атомарный. Обратите внимание, что ключевое слово atomic отсутствует.
Неатомный означает, что несколько потоков могут получить доступ к элементу. Это поток небезопасно
Поэтому нужно быть очень осторожным при использовании атомарного. Как это влияет на производительность вашего кода
источник
предпочитаю ссылки о свойствах в target-c в iOS ...
https://techguy1996.blogspot.com/2020/02/properties-in-objective-c-ios.html
источник