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