UIAlertView或UIActionSheet如何处理在ARC下保留/释放自己?

Sen*_*ful 1 objective-c automatic-ref-counting ios6

我想为UIAlertView创建一个类似的类,它不需要强大的ivar.

例如,使用UIAlertView,我可以在我的一个UIViewController方法中执行以下操作:

UIAlertView *alertView     = [[UIActionSheet alloc] initWithTitle:nil
                                                          message:@"Foo"
                                                         delegate:nil
                                                cancelButtonTitle:@"Cancel"
                                                otherButtonTitles:nil];
[alertView show];
Run Code Online (Sandbox Code Playgroud)

...并且在不再可见之前不会释放actionSheet.

如果我要尝试做同样的事情:

MYAlertView *myAlertView = [[MYAlertView alloc] initWithMessage:@"Foo"];
[myAlertView show];
Run Code Online (Sandbox Code Playgroud)

... myAlertView实例将在我当前的方法结束时自动解除分配(例如,[myAlertView show]在行之后).

什么是防止这种情况发生的正确方法,而无需strong在我的UIViewController 上将myView声明为属性?(即我希望myView是一个局部变量,而不是一个实例变量,我希望MYAlertView实例负责自己的生命周期,而不是我的UIViewController控制它的生命周期.)

更新:MYAlertView继承自NSObject,因此无法添加到Views层次结构中.

rob*_*off 5

UIAlertView创造一个UIWindow它保留的.然后,警报视图将自身添加为窗口的子视图,因此窗口将保留警报视图.因此,它创建了一个保持周期,使其和窗口保持活动状态. UIActionSheet以同样的方式工作.

如果你需要你的物体留在身边,没有别的东西可以保留它,它就可以保留它自己.您需要确保有一种定义明确的方法,以便在不再需要时自行释放.例如,如果它正在管理一个窗口,那么它应该在窗口离开屏幕时自行释放.