Objective c 释放UIAlertView时的奇数编码模式

Objective c 释放UIAlertView时的奇数编码模式,objective-c,cocoa-touch,ios,Objective C,Cocoa Touch,Ios,在很多代码示例中,也在Apple文档网站上,您会看到这种模式。UIAlertView的调用顺序为“显示”和“发布” UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Panic!" message:@"The world is gonna explode!" delegate:nil cancelButtonTitle:@"Who cares?" otherButtonTitles:@"Boom!", ni

在很多代码示例中,也在Apple文档网站上,您会看到这种模式。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框仍在屏幕上时,将显示“released!”日志行。在我看来,在屏幕上仍然可以看到这个对象的时候释放它似乎是一种奇怪的模式。这背后的想法是什么,这不是与内存管理的共同点相反吗?如果这个“show”调用被阻塞,我可以看到这个模式如何安全地释放内存。但由于执行了NSLog方法,它将继续执行您的代码。

[alert show]
保留
UIAlertView

释放
并不意味着将立即处置对象。这只是意味着,在这一点之后,您的代码不想再访问它了。其他代码(如系统框架)可能会这样做,因此他们会保留它。

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

正如其他人所指出的,您只是释放了UIAlertView的所有权,这并不意味着没有其他人拥有它。
[alert show]
赋予了系统所有权,因此没有必要保留它。您将在许多地方看到它。添加NSLog(@“警报保留通知%d”,[alert retainCount]);显示保留计数确实增加了很多。通过单一的“show”方法,它从1增加到6。问题是,
show
保留了alertview,但它本身并没有。但它将视图添加到superview中,并保留了它。苹果文档中是否说明-show拥有UIAlertView的所有权?