Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 如何发布“弹出”视图?_Objective C_Memory Management - Fatal编程技术网

Objective c 如何发布“弹出”视图?

Objective c 如何发布“弹出”视图?,objective-c,memory-management,Objective C,Memory Management,我有一个显示弹出窗口的类。 我对它做了一个alloc初始化,它就出现了 DarkVader* darkPopUp = [[DarkVader alloc] init:theButton helpMessage:[theButton.titleLabel.text intValue] isADay:NO offset:0]; 它会自动显示,如果用户按下Ok,它就会消失。我什么时候发布这个 当按下OK按钮时,我可以在课堂上进行[自我释放],对吗? 如果我这样做,分析器会说它的retain计数为+1

我有一个显示弹出窗口的类。 我对它做了一个alloc初始化,它就出现了

DarkVader* darkPopUp = [[DarkVader alloc] init:theButton helpMessage:[theButton.titleLabel.text intValue] isADay:NO offset:0];
它会自动显示,如果用户按下Ok,它就会消失。我什么时候发布这个

当按下OK按钮时,我可以在课堂上进行[自我释放],对吗? 如果我这样做,分析器会说它的retain计数为+1,并在调用函数中泄漏。 如果我在alloc init之后释放它,分析器会说它的retain计数为+0,我不应该释放它

    DLog(@"DarkVader retain count: %i", [darkPopUp retainCount]);
说它的计数是2。我很困惑


简言之,我的问题是:如何释放一个被初始化的对象,它做了一些工作并结束了,但调用函数中没有人释放它。

我的建议是使用

[self autorelease];

当视图自行关闭时。尽管您查看各种标准视图,但所有视图都会对负责关闭它们的委托执行回调;这让启动对象也负责释放视图。您也不清楚视图或视图控制器是如何显示的。

您可以执行与现有Cocoa Touch类类似的操作。例如,请参见如何显示UIAlertView:

很明显,UIAlertView做了一个[self-retain],或者更可能的是,当作为子视图添加到屏幕上show方法的某个地方时,会被保留

正如Paul所提到的,有些Cocoa Touch类确实不支持这种立即释放的方式,而是调用委托方法并让接收者释放它

    DLog(@"DarkVader retain count: %i", [darkPopUp retainCount]);

我想说的是,如果您的DarkVader是UIView,您应该让子视图retain处理retain计数。如果它是UIViewController或自定义帮助器类,您有几个选项,委托方式是简单而直接的。如果您想要以您描述的样式自定义弹出窗口,您可能已经有了首先对UIAlertView进行子类化。然后您可以使用它已经实现的保留/发布功能