我定义了一个成员实例frameCount
,其类型为Int!
,但是当我在块中引用它时,其类型变为Int?
。如果我不解包,Xcode将提示compile错误“可选类型'Int?的值'。没有包装;您的意思是使用'!'或“?”?”。
我可以使用它而不会解开块。
//Without unwrapping
self.frameCount = self.frameCount + 1
optQueue.async { [weak self] in
//frameCount become Int?.
//If I doesn't unwrap it Xcode will prompt complie error "Value of optional type 'Int?' not unwrapped; did you mean to use '!' or '?'?"
self?.frameCount = (self?.frameCount)! + 1;
}
答案 0 :(得分:3)
您的变量不是可选的!您的self
是。由于您正在执行异步调用,因此在执行完成操作时self
可能会不复存在。因此,您将其捕获为weak
。但是,如果您希望它强制运行,则可以删除[weak self]
,但它将强烈引用self
并防止其被释放。因此,如果不调用您的完成功能,它将永远不会被释放。
答案 1 :(得分:2)
这里self
是可选的,而不是frameCount
,您可以使用guard
来避免这种情况,因为您可能有很多需要访问self
的东西,而不是强制使用-全部展开
optQueue.async { [weak self] in
guard let strongSelf = self else { return }
strongSelf.frameCount += 1
}
答案 2 :(得分:1)
此外,您可以将weak self
替换为unowned self
,因此您对self的引用仍然较弱,但对可选self的引用却很弱。
但是,请谨慎使用该方法,如果self
将在执行完成之前被释放,则可能导致崩溃。
optQueue.async { [unowned self] in
self.frameCount = self.frameCount + 1
}