【发布时间】:2014-03-01 21:52:14
【问题描述】:
鉴于以下情况:
- (void) someMethod
{
dispatch_async(dispatch_get_main_queue(), ^{
myTimer = [NSTimer scheduledTimerWithTimeInterval: 60
target: self
selector: @selector(doSomething)
userInfo: nil
repeats: NO];
});
}
myTimer 在私有接口中声明的地方:
@interface MyClass()
{
NSTimer * myTimer;
}
@end
如何解决以下警告:
Block 隐式保留'self';明确提及“自我”以表明这是预期行为
从我目前的发现来看,大多数建议都包括以下内容:
- (void) someMethod
{
__typeof__(self) __weak wself = self;
dispatch_async(dispatch_get_main_queue(), ^{
wself.myTimer = [NSTimer scheduledTimerWithTimeInterval: 60
target: self
selector: @selector(doSomething)
userInfo: nil
repeats: NO];
});
}
除了 myTimer 是 ivar,这意味着 wself 无权访问任何属性。
我想我的问题是:
- 我关心/应该关心吗?
- 我应该将 myTimer 声明为属性吗?
我在代码中经常使用 ivars。我刚刚在我的项目中添加了-Weverything 标志,以查看是否可以找到任何潜在问题,这是迄今为止最常见的警告。我可以通过制作我的 ivars 属性来修复它并没有问题,但我想确保在我这样做之前得到更好的理解。
【问题讨论】:
-
"除了 wself 是一个 ivar,这意味着 wself 没有访问任何属性的权限。" - 笏?
-
@H2CO3 抱歉,应该说“除了 myTimer 是 ivar”。
-
我今天升级到 Xcode 9.3 后开始收到此警告,并遵循 Xcode 自己的建议更新项目设置。无中生有,我收到了 300 多条关于该项目的警告消息。
-
这是 Swift 引发的警告吗?如果是这样,为什么在我们应该编写代码时仍然反对内存管理的复杂性。
标签: objective-c macos objective-c-blocks