Объяснение того, как слабые и сильные работы работают в ReactiveCocoa/libextobjc
Я понимаю, что вы должны использовать @weakify @strongify, чтобы избежать циклов сохранения, но я не совсем понимаю, как они на самом деле этого достигают?
Ответы
Ответ 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
на своем месте, компилятор показывает ошибку