Различия между сильными и слабыми в Objective-C

Я новичок в Obj-C, поэтому мой первый вопрос:

Каковы различия между strong и weak в @property объявлениях указателей на объекты?

Кроме того, что означает nonatomic?

Ответ 1

Сильная ссылка (которую вы будете использовать в большинстве случаев) означает, что вы хотите "владеть" объектом, на который вы ссылаетесь, с этим свойством/переменной. Компилятор позаботится о том, чтобы любой объект, который вы назначили этому свойству, не будет уничтожен, пока вы укажете на него с сильной ссылкой. Только после того, как вы установите свойство на nil, объект будет уничтожен (если один или несколько других объектов также не содержат ссылки на него).

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

  • свойства делегата, на которые часто ссылаются слабо, чтобы избежать циклов сохранения, и

  • subviews/controls главного представления контроллера представления, поскольку эти представления уже сильно удерживаются основным видом.

atom vs. nonatomic относится к безопасности потоков методов getter и setter, которые компилятор синтезирует для свойства. atomic (по умолчанию) сообщает компилятору, чтобы методы доступа были потокобезопасными (добавив блокировку до входа ivar), а неатомное - наоборот. Преимущество неатомического - это несколько более высокая производительность. В iOS Apple использует неатомные почти для всех своих свойств, поэтому общие рекомендации для вас - сделать то же самое.

Ответ 2

Может быть полезно подумать о сильных и слабых ссылках с точки зрения воздушных шаров.

Воздушный шар не улетит, если хотя бы один человек держится за прикрепленную к нему веревку. Количество людей, держащих строки, - это счет сохранения. Когда никто не держится за строку, баллон улетит (dealloc). Многие люди могут иметь струны к тому же воздушному шару. Вы можете получить/установить свойства и методы вызова на указанном объекте с сильными и слабыми ссылками.

Сильная ссылка похожа на перенос строки на этот воздушный шар. Пока вы держитесь за веревку, прикрепленную к воздушному шару, она не улетит.

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

Ответ 3

strong: присваивает ему входящее значение, оно сохраняет входящее значение и освобождает существующее значение переменной экземпляра

слабый: присваивает ему входящее значение, не сохраняя его.

Таким образом, основное отличие заключается в сохранении новой переменной. Общее, вы хотите сохранить его, но есть ситуации, когда вы не хотите иметь его, иначе вы получите цикл удержания и не сможете освободить память объектов. Например. obj1 сохраняет obj2, а obj2 сохраняет obj1. Чтобы решить эту ситуацию, вы используете слабые ссылки.

Ответ 4

Фиктивный ответ: -

Я думаю, что объяснение дается в приведенном выше ответе, поэтому я просто расскажу вам, где использовать STRONG и где использовать WEAK:

Использование WEAK: - 1. Делегаты 2. Розетки 3. Подразделы 4. Элементы управления и т.д.

Использование STRONG: -  Оставшийся везде, который не включен в WEAK.

Ответ 5

сильные и слабые, эти ключевые слова вращаются вокруг владения объектами в Objective-C

Что такое владение объектом?

Переменные-указатели подразумевают владение объектами, на которые они указывают.

  • Когда у метода (или функции) есть локальная переменная, которая указывает на объект, говорят, что эта переменная владеет указанным объектом.
  • Когда у объекта есть переменная экземпляра, которая указывает на другой объект, говорят, что объект с указателем владеет указанным объектом.

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

Переменная может опционально не вступать во владение объектом, на который она указывает. Переменная, которая не становится владельцем объекта, называется слабой ссылкой.

Посмотрите подробное объяснение здесь Демистификация @property и атрибутов

Ответ 6

Здесь документация Apple объяснила разницу между слабым и сильным свойством, используя различные примеры:

https://developer.apple.com/library/ios/documentation/cocoa/conceptual/ProgrammingWithObjectiveC/EncapsulatingData/EncapsulatingData.html#//apple_ref/doc/uid/TP40011210-CH5-SW3

Здесь В этом блоге автор собрал все объекты недвижимости в одном месте. Это поможет сравнить характеристики свойств:

http://rdcworld-iphone.blogspot.in/2012/12/variable-property-attributes-or.html

Ответ 7

strong - значение по умолчанию. Объект остается "живым", если есть сильный указатель на него.

слабый указывает ссылку, которая не сохраняет объект ссылки. Слабая ссылка устанавливается равной нулю, если нет сильных ссылок на объект.

Ответ 8

Сильные и слабые - это новые типы ARC, которые заменяют сохранение и назначение соответственно. Делегаты и торговые точки должны быть слабыми. Ссылка strong - это ссылка на объект, который не позволяет ему освободиться. Другими словами, он создает отношения владельца. Ссылка слабая - это ссылка на объект, который не мешает ему освободиться. Другими словами, он не создает отношения владельца.

Ответ 9

Чтобы понять сильную и слабую ссылку, рассмотрим пример ниже. Предположим, у нас есть метод с именем 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.

Надеюсь это поможет.

Ответ 10

Простыми словами:

Сильный strong - замена атрибута сохранения как части Objective-C Автоматического подсчета ссылок (ARC). В коде, отличном от ARC, это просто синоним для сохранения.

Слабое

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

Ответ 11

Сильный. В основном используется с помощью свойств, которые мы использовали для получения или отправки данных из/в другие классы. Слабый. Обычно все выходы, соединения имеют слабый тип из интерфейса.

Nonatomic. Такой тип свойств используется в условиях, когда мы не хотим делиться своим выходом или объектом на разные одновременные потоки. Другими словами, Nonatomic instance делает наши свойства обрабатывать один поток за раз. Надеюсь, это будет полезно для вас.

Ответ 12

Сильные и слабые - это новые типы ARC, которые заменяют сохранение и назначение соответственно. Делегаты и торговые точки должны быть слабыми.

Сильный

Сильная ссылка - это ссылка на объект, который не позволяет ему освободиться. Другими словами, он создает отношения владельца.

Слабый

Слабая ссылка - это ссылка на объект, который не мешает ему освободиться. Другими словами, он не создает отношения владельца.