Ако кодът в блока извика метод, ще съществува ли цикъл на задържане, ако този метод се позовава на себе си? С други думи, трябва ли кодът надолу по блока да използва модела за слаб / силен сам?
Например:
__weak __typeof__(self) weakSelf = self;
Myblock block = ^{
[weakSelf doSomething];
};
. . .
- (void)doSomething
{
self.myProperty = 5; // Is this ok or does it need to use a weakSelf?
}
Отговори:
0 за отговор № 1Цикълът на задържане ще се задейства само ако запазите себе си в блока. В противен случай той ще хвърли само предупреждение.
Това е добре, можете да използвате това. Защото блокът запазва всеки използван вътре, така че да запази цикъла
- Сам ще запази блок
- Ако блокът запази себе си тогава
- Себе си отново щеше да задържи блока
- блок ще запази себе си, така че цикълът продължава
Това, което правите в метода, е просто съобщениепреминаване. Всеки блок се нарича съобщение, което ще бъде изпратено на самостоятелно, за да направи нещо. И можете да запазите себе си в doSomething метод, той няма да задейства задържа цикъл, защото този метод не е цикъл цикъл за самостоятелно. Надявам се да разберете :)
- (void)doSomething
{
self.myProperty = 5; // Is this ok or does it need to use a weakSelf?
}
1 за отговор № 2
Objective-C не е обхваната, както предполагате,а именно, че нямате достъп до slabSelf отвътре -doSomething. Освен това, както наричате -doSomething на weakSelf, "self" в това обаждане всъщност се отнася до същия обект, който е сам.
Накратко, не, не трябва, може и не трябва.
0 за отговор № 3
можете да направите това, за да се отървете от проблема на задържания цикъл.
[self class] __weak *weakSelf = self;
self.completionBlock = ^{
[self class] __strong *strongSelf = weakSelf
[weakSelf doSomething];
};