在街区内自我保留?

在调用块之前/之后,retaincount始终是1.从apple block doc我们知道self应该保留。 有谁知道为什么?

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(); 

首先, retainCount没用。 别叫它。

块仅在复制块时保留捕获的对象。 因此,在该示例中,块不会保留self

好的,我做了一些研究,现在事情变得更加清晰。 首先,我没有在block1上使用@property,这意味着当我设置它时,没有任何内容被复制,所以它们不被保留,其次,如果我们进行[块复制],变量将被保留,如果我们不复制,该块指向堆栈地址,将其复制到堆以使其安全。

变量’array’是一个Member变量,因此它不会被保留,同时self将被保留,无论你是否将它放在块中,如果变量是局部变量,它将被保留。 (这是我仍然困惑的事情,为什么不保留成员变量,而是在保留计数上再添加一个自己???请回答我?)

使用块后我们可以将它设置为nil self.block = nil; 使变量释放,并避免保留周期。

PS。 一个打破保留周期的方法是使用__block id weakSelf = self; 在块中,所以它意味着__block变量也不会被保留。