在街区内自我保留?

时间:2011-12-14 09:56:20

标签: objective-c ios block retain self

在调用块之前/之后,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();

2 个答案:

答案 0 :(得分:5)

首先, retainCount没用。不要打电话。

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

答案 1 :(得分:0)

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

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

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

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