当我在块中使用 "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)
)。在这种情况下,编译器可以或多或少地确定您正在此处创建循环引用,因此它会警告您。
我在块中尝试使用 "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)
)。在这种情况下,编译器可以或多或少地确定您正在此处创建循环引用,因此它会警告您。