当我在块中使用 "self" 时没有警告

No warning when I use "self" in block

我在块中尝试使用 "self" 时总是收到警告,直到:

__weak typeof(self) weakself = self;
[self.segmControl setSegmPosition:^(int position) {
    [weakself.scrollView scrollRectToVisible:CGRectMake(self.view.size.width*position, 0, weakself.view.size.width, weakself.view.size.height-10) animated:YES];

[weakself.segmControl setScrlView:position];
}];
[self.view addSubview:self.segmControl];

在块中使用 self 并不总是问题;如果编译器认为这样做会导致循环引用,则会发出警告。也就是说,在块中使用 self 会导致块保留 self 引用的对象;这没什么大不了的,除非 self 对象也持有对该块的强引用。

您发布的代码格式为:

[self.foo method:^{ [self bar]; }]

这显然不是问题。该块将捕获 self,但随后您将其传递给 self 仅持有其引用的对象上的方法。它可能创建循环引用,但也可能不会。我们必须知道方法内部发生了什么,编译器很难确定;即使您拥有方法 method: 的源代码,编译器也无法确定您在运行时调用该实现。

对比:

self.foo = ^{ [self bar]; }

在那种情况下,该块正在捕获 self 并保持对该块的强引用(假设 foo 定义为 @property (strong))。在这种情况下,编译器可以或多或少地确定您正在此处创建循环引用,因此它会警告您。