理解强指针并超出范围

时间:2015-04-26 23:28:42

标签: ios objective-c

我想了解以下情况

-(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实例的析构函数。

1 个答案:

答案 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,后者将其插入到视图控制器层次结构中并保留它。