gavinkwoe / BeeFramework

[Experimental] A semi-hybrid framework that allows you to create mobile apps using Objective-C and XML/CSS
MIT License
3.33k stars 1.06k forks source link

请教关于presentModalStack和dismissModalStackAnimated的使用问题。 #134

Closed ghost closed 9 years ago

ghost commented 9 years ago

在BeeFramework的官方示例应用https://github.com/GeekZooStudio/ECMobile_iOS 中看到这样的一段代码位于AppBoard_iPhone.m中

- (void)showLogin
{
    if ( self.modalStack )
    {
        return;
    }

    [self presentModalStack:[BeeUIStack stackWithFirstBoard:[A0_SigninBoard_iPhone board]] animated:YES];
}

- (void)hideLogin
{
    if ( nil == self.modalStack )
    {
        return;
    }

    [self dismissModalStackAnimated:YES];
}

很简单,一个是显示,一个是隐藏。但在使用时会发现一个问题,这个hideLogin是由A0_SigninBoard_iPhone自己去调用 。代码如下:

ON_LEFT_BUTTON_TOUCHED( signal )
{
    [[AppBoard_iPhone sharedInstance] hideLogin];
}

当A显示B,则[A presentModalStack:B]; 而B要关闭时,则是[A dismissModalStackAnimated]. 问题来了,B在调用A销毁自己时,自己已经被销毁了,但仍拿着A的引用,这会不会千万内存的泄露或其他总是问题呢?

另外,iOS的原生系统中显示和关闭ViewController的两个方法是,

- (void)presentViewController:(UIViewController *)viewControllerToPresent animated: (BOOL)flag completion:(void (^)(void))completion NS_AVAILABLE_IOS(5_0);
- (void)dismissViewControllerAnimated: (BOOL)flag completion: (void (^)(void))completion NS_AVAILABLE_IOS(5_0);

这两个方法一般是用法是。 A要显示B,则[A presentViewController:B], 当B要关闭时,则[B dismissViewControllerAnimated]就结束了。

两者的区别来了,想问的是_Bee有类似的方法或逻辑吗,或者说是Bee的流程我理解错了_,还请各位用过的多指正。

qfish commented 9 years ago
  1. 这个是程序的结构问题,AppBoard_iPhone 是一个单例,所以一直存在,不算是内存泄露。
  2. 推荐直接使用系统的提供的函数来管理您提到的场景。