我有这个类显示弹出窗口。 我在它上面做了一个alloc-init然后就出现了。
DarkVader* darkPopUp = [[DarkVader alloc] init:theButton helpMessage:[theButton.titleLabel.text intValue] isADay:NO offset:0];
它显示自己,如果用户按下确定,它就会消失。我什么时候发布这个?
按下OK按钮后,我可以在课堂上进行[自我释放]。它是否正确? 如果我这样做,分析器表示它的保留计数为+1并且在调用函数中被泄露。 如果我在alloc-init之后释放它,分析器说它的保留计数为+0,我不应该释放它。
DLog(@"DarkVader retain count: %i", [darkPopUp retainCount]);
说保留计数为2.我很困惑。
简而言之,我的问题是:如何释放一个被初始化的对象做了一些工作并结束但没有人在调用函数中释放它。
答案 0 :(得分:0)
我的建议是使用
[self autorelease];
当视图关闭时。虽然如果你看一下各种标准视图,那么所有人都会对一个负责关闭它们的委托实现回调;这个让启动对象负责释放视图。您也不清楚如何显示您的视图(或是视图控制器)。
答案 1 :(得分:0)
您可以执行类似于现有Cocoa Touch类的操作。例如,看看您如何展示UIAlertView
:
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"title" message:@"message" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
[alert show];
[alert release];
很明显UIAlertView
在[self retain]
方法的某个位置作为子视图添加到show
的某个地方时,会DarkVader
或更有可能保留{<1}}。
有一些Cocoa Touch类确实(就像Paul提到的那样)不会立即支持这种发布方式,而是调用委托方法并将接收器排除在外。
我想答案是,如果您的UIView
是UIViewController
,您应该让子视图保留处理保留计数。如果它是{{1}}或自定义帮助程序类,您有几个选项,委托方式是一个简单直接的方法。
答案 2 :(得分:0)
如果你想要你所描述的风格的自定义弹出窗口,你可能已经开始将UIAlertView子类化了。然后,您可以使用它已经实现的保留/释放功能。