在调用块之前/之后,retaincount始终为1。 从apple block 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();
答案 0 :(得分:5)
首先, retainCount没用。不要打电话。。
块仅在复制块时保留捕获的对象。因此,在该示例中,块不会保留self
。
答案 1 :(得分:0)
好的,我做了一些研究,现在事情变得更加清晰了。首先,我没有在block1上使用@property,这意味着当我设置它时,没有任何内容被复制,因此它们不被保留,其次,如果我们进行[块复制],变量将被保留,如果我们不复制,该块指向堆栈地址,将其复制到堆中以使其安全。
变量'array'是一个Member变量,因此它不会被保留,同时self将被保留,无论你是否将它放在块中,如果变量是局部变量,它将被保留。 (这是我仍然困惑的事情,为什么不保留成员变量,而是自我在保留计数上再添加一次???请回答我?)
使用块后我们可以将它设置为nil self.block = nil;使变量释放,并避免保留周期。
PS。一个打破保留周期的方法是使用__block id weakSelf = self;在块中,所以它意味着__block变量也不会被保留。