Сохранит ли себя в блоке? - PullRequest
2 голосов
/ 14 декабря 2011

До / После вызова блока, резервный счет всегда равен 1. Из яблочного блока doc мы знаем, что «я» должно сохранять. Кто-нибудь может знать почему?

NSLog(@"Before block retain count: %d", [self retainCount]);    
void (^block)(void) = ^(void){
    UIImage* img = [UIImage imageNamed:@"hometown.png"];
    [self setImage:img];
    NSLog(@"After block retain count: %d", [self retainCount]);
};
block();

Ответы [ 2 ]

5 голосов
/ 14 декабря 2011

Во-первых, retainCount бесполезен.Не называйте это. .

Блоки сохраняют только захваченные объекты при копировании блокаТаким образом, self не будет сохранено блоком в этом примере.

0 голосов
/ 16 августа 2013

ОК. Я провел небольшое исследование, теперь все стало более понятным. во-первых, я не использовал @property для block1, что означает, что когда я его установил, ничего не копируется, поэтому они не сохраняются, во-вторых, если мы сделаем [block copy], переменные будут сохранены, если мы не будем копировать , блок указывает на адрес стека, скопируйте его в кучу, чтобы сделать его безопасным.

переменная 'массив' является переменной-членом, поэтому она не сохраняется, и, в то же время, значение self будет сохранено, независимо от того, помещаете ли вы его в блок или нет, если переменная является локальной переменной, она будет сохранена. (это то, что я до сих пор не понимаю, почему переменная-член не сохраняется, вместо этого добавляется self еще на один счет ??? pls, ответьте мне?)

после использования блока мы можем установить его равным nil self.block = nil; чтобы освободить переменные, и избежать цикла сохранения.

PS. метод, позволяющий прервать сохранение цикла, это использовать __block id weakSelf = self; в блоке, это означает, что переменные __block также не сохраняются.

...