我想了解以下情况
-(void) foo
{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error"
message:@"Could not save file"
delegate:self
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[alert show];
}
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
//This is called when ok is pressed
}
在上面的代码中,创建了一个UIAlertView
强指针,并指定了一个自己的委托。我称之为强引用指针的原因是因为它是在范围内创建的,并且当引用计数变为0时将超出范围。我相信当方法foo
结束时引用计数变为0然后为什么是我仍在clickedButtonAtIndex
收到回电?我假设我们不会得到回调,因为只要方法foo
结束就会调用alertView实例的析构函数。
答案 0 :(得分:3)
你相信错了。当你说我相信引用计数为0
[alert show]
时,你将警报对象交给Cocoa,后者保留它;否则屏幕上不会出现警报视图!该警报视图对您有一个引用(实际上很弱)(self
)。因此Cocoa能够在委托回调中将相同的警报视图传递给您;警报仍然存在,因为Cocoa仍然保留它,并且你还活着,因为你还活着,所以对self
的引用就是回调的目标。
另外,我不能确定你是否在你说[alert show]
之后就知道了,代码确实没有暂停 - 它会立即开启。因此,在警报实际出现在屏幕上之前,第一种方法是 over 。同样,这是有效的,因为警报已经移交给Cocoa,Cocoa保留它并负责在下一个runloop上显示它。当屏幕上出现警报时,您的代码都没有运行。
完全平行的情况是
MyViewController* vc = [MyViewController new];
[self.presentViewController:vc animated:YES completion:nil];
代码结束了,为什么MyViewController不会在一阵烟雾中消失?因为presentViewController
将它交给Cocoa,后者将其插入到视图控制器层次结构中并保留它。