释放UIAlertView时出现奇怪的编码模式

时间:2011-01-03 08:14:44

标签: objective-c cocoa-touch ios

在许多代码示例中,也在Apple文档网站上,您将看到这种模式。使用" show"来调用UIAlertView。和"发布"按顺序。

UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Panic!"
    message:@"The world is gonna explode!"
    delegate:nil cancelButtonTitle:@"Who cares?"
    otherButtonTitles:@"Boom!", nil];
[alert show];
[alert release];
NSLog(@"released!");

当您运行此代码时,"已发布!"当UIAlertView框仍在屏幕上时,将显示日志行。当它仍然在屏幕上看到时,释放这个对象似乎是一种奇怪的模式。这背后的想法是什么,这不是针对内存管理的常见问题吗?如果这个"显示"呼叫会阻塞,我可以看到这种模式如何安全地释放内存。但是,由于执行了NSLog方法,它会继续执行您的代码。

3 个答案:

答案 0 :(得分:5)

release并不意味着物体会立即被处理掉。它只是意味着您的代码在此之后不再需要访问它。其他代码(如系统框架)可能会保留它。

答案 1 :(得分:4)

[alert show];保留UIAlertView

答案 2 :(得分:0)

如果您检查代码,您会看到在创建UIAlertView时它也正在分配。因此,警报的保留计数为1。 如果您阅读Apple文档,您将看到[alert show]也会增加UIAlertView的保留计数。因此,在该行之后,保留计数将为2。 行[alert release]会再次将保留计数减少到1,因为对于此代码,保持对UIAlertView的引用并不重要。 因此,在此之后,保留计数为1,并显示UIAlertView。当用户按下按钮关闭警报时,关闭警报的方法会将保留计数减少到0并释放内存