【发布时间】:2014-07-22 08:24:00
【问题描述】:
如果我调用一次,以下函数将不会打印“nil1”或“nil2”。 但是,如果我把它放在一个循环中,一些迭代将打印“nil2”ONLY。
这是怎么回事?如果用户为 nil,为什么不打印“nil1”?
去掉 "weakUser" 声明前的 __weak 指令后,即使在循环中多次调用,函数也不会再打印 "nil"。
有什么想法吗?
- (void)hello: (void(^))callback
{
User *user = [[User alloc] init]; // user is not nil
__weak User *weakUser = user; // removing __weak won't cause problems.
if(weakUser == nil)
{
NSLog(@"nil1");
}
[ABC func: ^{
if(weakUser == nil)
{
NSLog(@"nil2");
}
callback();
}];
}
【问题讨论】:
-
为什么要打印
"nil1"?weakUser根本不是nil,你只是用一个强指针在同一范围内实例化了一个对象,user指向上面的一行..."nil1"将是在这种情况下从未打印过。 -
"nil2"仅在您的块运行之前释放user时打印。当您的方法完成时,您可以指望user将立即成为nil,但是没有关于 when 块在此上下文中完全运行的信息,也就是 after 你的方法已经完成或之前。 -
如果您从
weakUser中删除__weak,则该指针将自动变为__strong,并且您的块通过weakUser使对象保持活动状态,直到该块被释放。 -
@holex 在“hello”调用超出范围时用户被释放后可能会执行块上的好点。谢谢。
标签: objective-c pointers callback objective-c-blocks weak-references