Я новичок в Obj-C, поэтому мой первый вопрос:
Каковы различия между strong
и weak
в @property
объявлениях указателей на объекты?
Кроме того, что это nonatomic
значит?
Я новичок в Obj-C, поэтому мой первый вопрос:
Каковы различия между strong
и weak
в @property
объявлениях указателей на объекты?
Кроме того, что это nonatomic
значит?
Ответы:
Сильная ссылка (которую вы будете использовать в большинстве случаев) означает, что вы хотите «владеть» объектом, на который вы ссылаетесь, с помощью этого свойства / переменной. Компилятор позаботится о том, чтобы любой объект, который вы назначаете этому свойству, не был уничтожен, пока вы на него указываете с сильной ссылкой. Только после того, как вы установите свойство в nil
, объект будет уничтожен (если только один или несколько других объектов также не имеют строгой ссылки на него).
Напротив, со слабой ссылкой вы обозначаете, что не хотите контролировать время жизни объекта. Объект, на который вы слабо ссылаетесь, живет только потому, что по крайней мере еще один объект содержит сильную ссылку на него. Если это уже не так, объект уничтожается, и ваше слабое свойство автоматически устанавливается на nil
. Наиболее частые случаи использования слабых ссылок в iOS:
свойства делегата, на которые часто ссылаются слабо, чтобы избежать сохранения циклов, и
подпредставления / элементы управления основного представления контроллера представления, потому что эти представления уже прочно удерживаются основным представлением.
Атомное и неатомное относится к безопасности потоков методов получения и установки, которые компилятор синтезирует для свойства. atomic (по умолчанию) указывает компилятору сделать методы доступа потоко-безопасными (добавляя блокировку до доступа к ivar), а nonatomic делает обратное. Преимущество nonatomic - немного более высокая производительность. На iOS Apple использует nonatomic почти для всех своих свойств, поэтому общий совет - сделать то же самое.
atomic
гарантирует, что свойство может быть безопасно прочитано и записано из нескольких потоков одновременно. Это не означает, что объект, все свойства которого являются atomic
автоматически потокобезопасным.
Может быть полезно подумать о сильных и слабых ссылках с точки зрения воздушных шаров.
Воздушный шар не улетит, пока хотя бы один человек держится за привязанную к нему веревку. Количество людей, удерживающих строки, является счетом удержания. Когда никто не держится за веревку, баллон улетит (dealloc). У многих людей могут быть струны к тому же воздушному шару. Вы можете получить / установить свойства и вызвать методы для ссылочного объекта с сильными и слабыми ссылками.
Сильная ссылка похожа на то, как ты держишься за шнурок с этим шариком. Пока вы держитесь за веревку, прикрепленную к воздушному шару, он не улетит.
Слабая ссылка похожа на взгляд на воздушный шар. Вы можете увидеть его, получить доступ к его свойствам, вызвать его методы, но у вас нет строки для этого всплывающего окна. Если все, кто держится за веревку, отпускают, воздушный шар улетает, и вы больше не можете получить к нему доступ.
strong
и на weak
самом деле имею в виду.
сильный : присваивает ему входящее значение, оно сохраняет входящее значение и освобождает существующее значение переменной экземпляра
слабый : назначит ему входящее значение, не сохраняя его.
Таким образом, основное отличие заключается в сохранении новой переменной. Обычно вы хотите сохранить его, но есть ситуации, когда вы не хотите его иметь, иначе вы получите цикл сохранения и не сможете освободить память объектов. Например. obj1 сохраняет obj2, а obj2 сохраняет obj1. Чтобы решить такую ситуацию, вы используете слабые ссылки.
Дурацкий ответ: -
Я думаю, что объяснение дается в ответе выше, поэтому я просто скажу вам, где использовать STRONG
и где использовать WEAK
:
Использование Weak
: -
1. Делегатов 2. Аутлетов 3. Подвидов 4. Органов управления и т. Д.
Использование Strong
: -
Остальное везде, что не входит в WEAK
.
сильные и слабые , эти ключевые слова вращаются вокруг владения объектами в Objective-C
Что такое владение объектом?
Переменные-указатели подразумевают владение объектами, на которые они указывают.
Каждый раз, когда переменная указателя указывает на объект, этот объект имеет владельца и останется живым. Это известно как сильная ссылка.
Переменная может опционально не вступать во владение объектом, на который она указывает. Переменная, которая не становится владельцем объекта, называется слабой ссылкой.
Посмотрите подробное объяснение здесь Демистификация @property и атрибутов
Здесь Apple Documentation объяснила разницу между слабым и сильным свойством, используя различные примеры:
Здесь В этом блоге автор собрал все объекты недвижимости в одном месте. Это поможет сравнить характеристики свойств:
http://rdcworld-iphone.blogspot.in/2012/12/variable-property-attributes-or.html
сильный это по умолчанию. Объект остается «живым» до тех пор, пока на него есть сильный указатель.
Слабый указывает ссылку, которая не поддерживает ссылочный объект живым. Слабая ссылка устанавливается на ноль, когда нет сильных ссылок на объект.
Чтобы понять сильные и слабые ссылки, рассмотрим пример ниже. Предположим, у нас есть метод с именем displayLocalVariable.
-(void)displayLocalVariable
{
UIView* myView = [[UIView alloc] init];
NSLog(@"myView tag is = %ld", myView.tag);
}
В приведенном выше методе область действия переменной myView ограничена методом displayLocalVariable, как только метод завершится, переменная myView, которая содержит объект UIView, будет освобождена из памяти.
Теперь, что если мы хотим сохранить переменную myView на протяжении всего жизненного цикла нашего контроллера представления. Для этого мы можем создать свойство с именем usernameView, которое будет иметь строгую ссылку на переменную myView (см. @property(nonatomic,strong) UIView* usernameView;
И self.usernameView = myView;
ниже в коде), как показано ниже:
@interface LoginViewController ()
@property(nonatomic,strong) UIView* usernameView;
@property(nonatomic,weak) UIView* dummyNameView;
- (void)displayLocalVariable;
@end
@implementation LoginViewController
- (void)viewDidLoad
{
[super viewDidLoad];
}
-(void)viewWillAppear:(BOOL)animated
{
[self displayLocalVariable];
}
- (void)displayLocalVariable
{
UIView* myView = [[UIView alloc] init];
NSLog(@"myView tag is = %ld", myView.tag);
self.usernameView = myView;
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
}
@end
Теперь в приведенном выше коде вы можете видеть, что myView был назначен для self.usernameView, а self.usernameView имеет сильную ссылку (как мы объявили в интерфейсе с использованием @property) на myView. Следовательно, myView не будет освобожден из памяти до тех пор, пока self.usernameView не станет активным.
Теперь рассмотрим назначение myName для dummyNameView, который является Слабой ссылкой, в self.dummyNameView = myView;
отличие от Сильной ссылки Слабый будет удерживать myView только до тех пор, пока не будет Сильная ссылка на myView. Посмотрите код ниже, чтобы понять слабую ссылку,
-(void)displayLocalVariable
{
UIView* myView = [[UIView alloc] init];
NSLog(@"myView tag is = %ld", myView.tag);
self.dummyNameView = myView;
}
В приведенном выше коде есть Слабая ссылка на myView (т. Е. Self.dummyNameView имеет Слабую ссылку на myView), но нет строгой ссылки на myView, поэтому self.dummyNameView не сможет содержать значение myView.
Теперь снова рассмотрим приведенный ниже код,
-(void)displayLocalVariable
{
UIView* myView = [[UIView alloc] init];
NSLog(@"myView tag is = %ld", myView.tag);
self.usernameView = myView;
self.dummyNameView = myView;
}
В приведенном выше коде self.usernameView имеет ссылку Strong на myView, поэтому self.dummyNameView теперь будет иметь значение myView даже после завершения метода, поскольку myView имеет ссылку Strong, связанную с ним.
Теперь, когда мы делаем ссылку Strong на переменную, ее счетчик хранения увеличивается на единицу, и переменная не освобождается, пока ее счетчик не достигнет 0.
Надеюсь это поможет.
Сильный : в основном используется со свойствами, которые мы использовали для получения или отправки данных из / в другие классы. Слабый : Обычно все выходы, соединения имеют слабый тип от интерфейса.
Неатомные : свойства такого типа используются в условиях, когда мы не хотим делить нашу точку или объект на разные одновременные потоки. Другими словами, Nonatomic instance заставляет наши свойства работать с одним потоком за раз. Надеюсь, это полезно для вас.