Подтвердить что ты не робот

Объяснение того, как слабые и сильные работы работают в ReactiveCocoa/libextobjc

Я понимаю, что вы должны использовать @weakify @strongify, чтобы избежать циклов сохранения, но я не совсем понимаю, как они на самом деле этого достигают?

4b9b3361

Ответ 1

При написании вопроса я более пристально смотрел на макроопределения, и я думаю, что он работает так, как вы могли догадаться.

@weakify создает новую слабосвязанную переменную того же типа, которую вы передаете, и присваивает ей исходное значение

@strongify создает переменную, которая соответствует исходной переменной, но она существует в локальной области и присваивает ей переменную, созданную @weakify

Ответ 2

перед препроцессом:

@weakify(self)
[[self.searchText.rac_textSignal
  map:^id(NSString *text) {
      return [UIColor yellowColor];
  }]
 subscribeNext:^(UIColor *color) {
     @strongify(self)
     self.searchText.backgroundColor = color;
 }];

после препроцесса:

@autoreleasepool {} __attribute__((objc_ownership(weak))) __typeof__(self) self_weak_ = (self);
    [[self.searchText.rac_textSignal
      map:^id(NSString *text) {
          return [UIColor yellowColor];
      }]
     subscribeNext:^(UIColor *color) {
         @try {} @finally {}
 __attribute__((objc_ownership(strong))) __typeof__(self) self = self_weak_; // 1
 self.searchText.backgroundColor = color;  //2
     }];

1: определить новую локальную переменную "self". это затмит глобальное.

2: поэтому мы использовали локальную переменную "self" - self_weak_.

советы:

1.если мы использовали self.xxx в блоке, мы должны поместить @strongify (self) над ним.

2. не забывайте использовать @weakify (self), чтобы определить переменную self_weak _.

(PS: Я пытаюсь выучить английский. Я надеюсь, что вы поймете, что я говорю.)

Ответ 3

Прежде всего, важно то, что вы используете @weakify и @strongify, поскольку они не являются частью стандартного языка. Предполагая, что вы используете версию ReactiveCocoa, вот хорошая статья о том, что они собой представляют и как они работают.

Вот несколько релевантных цитат:

Даже написанный нами код не может безопасно использовать self, например. NSAssert макрос. По-прежнему можно ссылаться на реальный self, используя ivar. Это приводит к предупреждению, однако, это ошибка, которую легко обнаружить

Теперь вы можете спросить: что, если я забуду использовать strongify? Это классная часть: weakify создает новую локальную переменную, поэтому, если она вообще не используется, мы получаем предупреждение.

Как вы можете себе представить, если вы забыли использовать weakify, но strongify на своем месте, компилятор показывает ошибку