/ / Дали методите, извикани от един блок, трябва да използват слабата Себе? - цел-c, обективни c-блокове, задържащ цикъл

Трябва ли методи, наречени от един блок, да се използват слабо? - обекти-c, обекти-c-блокове, запазване на цикъла

Ако кодът в блока извика метод, ще съществува ли цикъл на задържане, ако този метод се позовава на себе си? С други думи, трябва ли кодът надолу по блока да използва модела за слаб / силен сам?

Например:

__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

Цикълът на задържане ще се задейства само ако запазите себе си в блока. В противен случай той ще хвърли само предупреждение.

Това е добре, можете да използвате това. Защото блокът запазва всеки използван вътре, така че да запази цикъла

  1. Сам ще запази блок
  2. Ако блокът запази себе си тогава
  3. Себе си отново щеше да задържи блока
  4. блок ще запази себе си, така че цикълът продължава

Това, което правите в метода, е просто съобщениепреминаване. Всеки блок се нарича съобщение, което ще бъде изпратено на самостоятелно, за да направи нещо. И можете да запазите себе си в 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];
};