美文网首页
推出控制器,然后直接Delloc了

推出控制器,然后直接Delloc了

作者: 玉米地里种玉米 | 来源:发表于2017-03-07 15:25 被阅读22次

    在推出一个新的视图时候 : push 之后
    显示:没有卡顿,感觉只是没有推出去
    debug:push之后 新视图的任何生命周期 都没有走,直接走了Delloc
    情况一:
    MyViewController *sampleViewController = [[[ MyViewController alloc ] initWithXXX ] autorelease ];
    [self. navigationController pushViewController : sampleViewController animated : true ];
    BUG:界面无反应
    分析可能出错的原因:
    1: self. navigationController为nil,空指针执行 pushViewController直接跳过,接着 sampleViewController会释放掉,所以界面会无反应。
    self. navigationController 为神马会空呢? navigationController是UIViewController父类继承来的属性,不是随便都能用的,除非你当前viewController是被nav push进来的,或者用xib/代码做成navigationcontroller的root了,cocoa的代码应该是给赋值了。(题外话,我很多界面就是局部用了某个ViewController,这种情况该viewController的nav为空,如果要正确使用,可以从app取,可以自己赋值,可以整体界面取。。。想咋取都行)
    2、 self. navigationController为nil,界面挂了
    如果你 sampleViewController用到了网络异步请求,在initWithXXX的时候会去取数,那么你10有89会挂掉。
    原因分析:大家网络请求,经常如下:
    TwitterClient *twitterClient = [[ TwitterClient alloc ] initWithTarget : self action : @selector (XXXReceive:obj:)];
    [ twitterClient getXXX :param];
    恭喜你,这种情况不管是不是 navigationController为空,你程序极容易挂掉,原因就是因为网络请求我们都会用异步方式来拉取数据,当数据回来之后,会回调到本类的 XXXReceive:obj方法,
    但是如果界面退出了,数据才收到将如何?那就是不是空指针调用了, TwitterClient里纪录的需要回调的内存地址上神马情况都有可能是,回调。。杯具了
    解决办法: twitterClient做成成员,在析构的时候该咋收拾 twitterClient的就咋收拾一下吧
    3、 self. navigationController为nil,界面挂了
    和上文一样 twitterClient成员了, dealloc也清理了现场,还是会挂
    原因分析:异步的问题, twitterClient已经取到数据,但是 sampleViewController已经被释放了,but dealloc根本没来得及进来。。。
    解决办法,1:确保nav正确,2:尽量在界面 viewDidLoad的时候网络请求数据,在dispear的时候清理网络。
    情况二:
    reason: 'Pushing a navigation controller is not supported'
    报上面的错误,原因是:
    大家知道,可以将ViewController push到一个 NavigationController中。就像是入栈操作!
    将一个NavigationController再次push到NavigationController中时,报错,出現了
    reason: 'Pushing a navigation controller is not supported' 的错误。
    应该是,NavigationController不支持push进來的对象是NavigationController吧。
    修改方法是: 将要进入的页面不去继承UI NavigationController
    情况三:
    有时候项目里会有一种消息推送, 就是弹出提示用户消息, 而消息中带有链接, 当你点击连接时不能跳转,
    这种情况是因为你的self.n avigationController = nil 造成的,
    因为你弹窗的那个控制器没有用 UI NavigationController包装
    总结:
    确保nav正确。
    这种情况是因为你的self.navigationController = nil 造成的,
    因为你弹窗的那个控制器没有用UINavigationController包装

    相关文章

      网友评论

          本文标题:推出控制器,然后直接Delloc了

          本文链接:https://www.haomeiwen.com/subject/hpmmgttx.html