Kex*_*Kex 0 objective-c uiviewcontroller ios objective-c-blocks
我想了解这段代码:
__weak LoginViewController *weakSelf = self;
NSTimer *networkTimer = [NSTimer pym_scheduledTimerWithTimeInterval:15.0 block:^{
LoginViewController *strongSelf = weakSelf;
[strongSelf timeout];
} repeats:NO];
[PYMAuthManager loginWithUsername:username password:password completionHandler:^(BOOL successful) {
if (successful) {
[networkTimer invalidate].......
Run Code Online (Sandbox Code Playgroud)
这是一个网络计时器,如果没有活动,将在15秒后超时.为什么在块中创建指针*strongSelf = weakSelf?使用[weakSelf timeout]不行吗?我明白无论何时在块中访问self我们都必须使用弱引用,为什么在这里创建另一个指针?任何帮助都会很棒,谢谢.
编辑:更新以更好地反映实际的系统语义(正如Darren所指出的).
通过weakSelf在块中使用,您可以避免保留周期.如果要用块替换块代码[weakSelf timeout],则没有区别; 该对象在timeout执行期间保留.
如果您曾经__unsafe_unretained创建过weakSelf,那么机器可能会将内存释放回系统并导致应用程序EXC_BAD_ACCESS执行timeout.在此实例中创建强引用可以避免此错误.
当您创建强引用时,它将保持在其范围内; 在这种情况下,在块的持续时间内.因为您的块只能有效地执行一个语句,所以替换不会[weakSelf timeout]造成任何伤害.如果您有多个语句都使用weakSelf或依赖于状态weakSelf,那么您可能希望为所有语句的范围创建强引用.
| 归档时间: |
|
| 查看次数: |
486 次 |
| 最近记录: |