Ios 理解强指针和超出范围

Ios 理解强指针和超出范围,ios,objective-c,Ios,Objective C,我想了解以下情况 -(void) foo { UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error" message:@"Could not save file" delegate:self

我想了解以下情况

-(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
强指针,并为self分配了一个委托。我之所以称它为强引用指针,是因为它是在作用域中创建的,当其引用计数变为0时,它将超出作用域。我相信当方法
foo
结束时,引用计数会变为0,那么为什么我仍然在
ClickedButtonIndex
处收到回调?我假设我们不会得到回调,因为只要方法
foo
结束,就会调用alertView实例的析构函数

我相信参考计数为0

你错了。当你说
[alert show]
时,你把alert对象交给Cocoa,Cocoa会保留它;否则,屏幕上将不会显示警报视图!该警报视图对您有一个引用(实际上很弱)(
self
)。因此,Cocoa能够在委托回调中将非常相同的警报视图交还给您;该警报仍处于活动状态,因为Cocoa仍保留该警报,而您仍处于活动状态,因为您仍处于活动状态,因此对
self
的引用作为回调的目标

另外,我也不太清楚你是否理解,只要你说
[alert show]
,代码就不会暂停-它会立即继续。因此,第一种方法在警报实际出现在屏幕上之前就结束了。同样,这是有效的,因为警报已移交给Cocoa,Cocoa保留警报并负责在下一次运行循环中显示警报。屏幕上显示警报时,没有代码正在运行

一种完全平行的情况正在发生

MyViewController* vc = [MyViewController new];
[self.presentViewController:vc animated:YES completion:nil];
代码结束了,为什么MyViewController没有消失在一股烟雾中?因为
presentViewController
将其交给Cocoa,Cocoa将其插入到视图控制器层次结构中并保留它

我相信参考计数为0

你错了。当你说
[alert show]
时,你把alert对象交给Cocoa,Cocoa会保留它;否则,屏幕上将不会显示警报视图!该警报视图对您有一个引用(实际上很弱)(
self
)。因此,Cocoa能够在委托回调中将非常相同的警报视图交还给您;该警报仍处于活动状态,因为Cocoa仍保留该警报,而您仍处于活动状态,因为您仍处于活动状态,因此对
self
的引用作为回调的目标

另外,我也不太清楚你是否理解,只要你说
[alert show]
,代码就不会暂停-它会立即继续。因此,第一种方法在警报实际出现在屏幕上之前就结束了。同样,这是有效的,因为警报已移交给Cocoa,Cocoa保留警报并负责在下一次运行循环中显示警报。屏幕上显示警报时,没有代码正在运行

一种完全平行的情况正在发生

MyViewController* vc = [MyViewController new];
[self.presentViewController:vc animated:YES completion:nil];
代码结束了,为什么MyViewController没有消失在一股烟雾中?因为
presentViewController
将其交给Cocoa,Cocoa将其插入到视图控制器层次结构中并保留它

我相信参考计数为0

你错了。当你说
[alert show]
时,你把alert对象交给Cocoa,Cocoa会保留它;否则,屏幕上将不会显示警报视图!该警报视图对您有一个引用(实际上很弱)(
self
)。因此,Cocoa能够在委托回调中将非常相同的警报视图交还给您;该警报仍处于活动状态,因为Cocoa仍保留该警报,而您仍处于活动状态,因为您仍处于活动状态,因此对
self
的引用作为回调的目标

另外,我也不太清楚你是否理解,只要你说
[alert show]
,代码就不会暂停-它会立即继续。因此,第一种方法在警报实际出现在屏幕上之前就结束了。同样,这是有效的,因为警报已移交给Cocoa,Cocoa保留警报并负责在下一次运行循环中显示警报。屏幕上显示警报时,没有代码正在运行

一种完全平行的情况正在发生

MyViewController* vc = [MyViewController new];
[self.presentViewController:vc animated:YES completion:nil];
代码结束了,为什么MyViewController没有消失在一股烟雾中?因为
presentViewController
将其交给Cocoa,Cocoa将其插入到视图控制器层次结构中并保留它

我相信参考计数为0

你错了。当你说
[alert show]
时,你把alert对象交给Cocoa,Cocoa会保留它;否则,屏幕上将不会显示警报视图!该警报视图对您有一个引用(实际上很弱)(
self
)。因此,Cocoa能够在委托回调中将非常相同的警报视图交还给您;该警报仍处于活动状态,因为Cocoa仍保留该警报,而您仍处于活动状态,因为您仍处于活动状态,因此对
self
的引用作为回调的目标

另外,我也不太清楚你是否理解,只要你说
[alert show]
,代码就不会暂停-它会立即继续。因此,第一种方法在警报实际出现在屏幕上之前就结束了。同样,这是有效的,因为警报已移交给Cocoa,Cocoa保留警报并负责在下一次运行循环中显示警报。屏幕上显示警报时,没有代码正在运行

一种完全平行的情况正在发生

MyViewController* vc = [MyViewController new];
[self.presentViewController:vc animated:YES completion:nil];
代码结束了,为什么MyViewController没有消失在一股烟雾中?因为
presentViewController
将其交给Cocoa,Cocoa将其插入到视图控制器层次结构中并保留它。

请参见我的书:当然,在很多情况下,您会将对象交给Cocoa