`
wsqwsq000
  • 浏览: 675367 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

由pushViewController说起可能出线的各种死法

 
阅读更多

     做苹果开发或者果粉对导航条这个东西应该都不陌生,这咚咚在小小的屏幕上通过一个简单的View的队列管理来做到手机界面的有条理管理,但是开发过程程序员可能碰到各种死法,下面分享一二。

          例子:
MyViewController *sampleViewController = [[[MyViewController alloc] initWithXXX] autorelease];       

[self.navigationController pushViewController: sampleViewController animated:true];

[sampleViewController release];


上面代码通常在一个UITabViewController中,某一行选中后,切换到详细内容,上面代码比较简单,先从他的死法说起。

死法1:  objectc程序员菜鸟常放的毛病导致,上面代码必死,为神马呢?

nav的push会导致引用计数的增加,界面会苟延残喘一会,当popview的时候,最后一行release会把sampleViewController清0,接着就是autopool回收的的时候XXX了

     终结:为了避免内存泄露,alloc必对应release或者autorelease,但是必须11对应,同理

用全局函数生成的类,你就不要release了,除非你retain(如果你要长期使用,retain是必须的),objectc的内存管理必须小心翼翼,否则。。。,我个人习惯,宁可挂掉也不能泄露,因为挂掉容易发现问题,泄露了又有几个程序员用工具分析解决呢。


开胃菜结束,开始正题:

MyViewController *sampleViewController = [[[MyViewController alloc]initWithXXXautorelease];       

[self.navigationController pushViewController: sampleViewController animated:true];

死法2:界面无反应,或者把自己界面刷了一下。

      分析可能出线的原因:

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的时候清理网络。

分享到:
评论

相关推荐

    导航控制器pushViewController

    导航控制器pushViewController,导航控制器pushViewController的源代码。

    IOS pushViewController实例 百度地图push视图效果

    pushViewContoller实现的手势滑动 百度地图push视图效果完整实例代码

    iOS pushViewController实例,有层次效果和手势滑动,很火很实用

    最近很多应用都在用的pushViewContoller效果,比如百度地图。希望能够帮助到大家。

    ios开发navigationController pushViewController 方式多次跳转返回到最上层返回到指定的某一层的实现方法

    主要介绍了ios开发navigationController pushViewController 方式多次跳转返回到最上层返回到指定的某一层的实现方法的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下

    swift-iOSViewController间切换的转场动画

    XLBubbleTransition 是一个适用于UINavigation的转场动画,在Push和Pop这两个动作时显示

    iOS 开发中 NavigationController经常出现的问题原因分析

    情况一: MyViewController *sampleViewController = [[...分析可能出错的原因: 1:self.navigationController为nil,空指针执行pushViewController直接跳过,接着sampleViewController会释放掉,所以界面会无反

    ios-仿今日头条SegmentedControl.zip

    仿今日头条SegmentedControl 几行代码搞定 ``` MLViewController *vv = [[MLViewController alloc] init]; OneViewController * alloc] init... [self.navigationController pushViewController:vc animated:YES]; ```

    ios-SGAdvertScrollView.zip

    淘宝、天猫、京东、支付宝等 app 常见的文字轮播视图 CocoaPods 导入 pod 'SGAdvertScrollView','~> 1.2.6' ... 例一: ... [self.navigationController pushViewController:nextVC animated:YES]; }

    iOS指纹识别功能

    [self.navigationController pushViewController:successVC animated:YES]; } else { // 获取到相应的错误信息····做相应的操作 // 失败 } }]; }else { // NSLog(@"Touch ID 不可用"); }

    ios-图片浏览器.zip

    // [self.navigationController pushViewController:wyzAlbumVC animated:NO]; // [self.navigationController.view.layer transitionWithAnimType:TransitionAnimTypeRamdom subType:TransitionSubtypesFromRamdom ...

    实现多层视图布局效果

    可以设置视图出现和隐藏的过渡动画,有6种动画方式(具体请看视频或者下载代码体验)。视图推进、退出动画十分流程,大家可以研究一下吧。 使用方法: 创建一个SCStackViewController实例: stackViewController =...

    iOS PDF电子签章

    占用体积较小的原生加载PDF电子签章库,使用方法 let pdfVC:TrustSignPDFDSController = TrustSignPDFDSController.init(filePath: pdfPath, ...self.navigationController.pushViewController(pdfVC, animated: true)

    Flutter开发之路由与导航的实现

    在Android中路由指的是一个Activity,在iOS中指的是一个ViewController,可以通过startActivity或pushViewController来打开一个新的路由。在Flutter中,路由的管理和导航借鉴了前端和客户端的设计思路,需要使用...

    ZXing QRCode Scan

    iOS ZXing QRCode Scan Parse How to use it in your code: 1. #import ... [self.navigationController pushViewController:wid_ctrl animated:YES]; [wid_ctrl release]; wid_ctrl = nil;

    ios-城市选择.zip

    简单的城市选择,使用方法: //城市选择 CityChooseViewController *vc = [CityChooseViewController new]; //选择以后的回调 ... [self.navigationController pushViewController:vc animated:YES];

    ios-RACBaseServices.zip

    原ViewContoller和NavigationController的presentViewController和pushViewController等方法,将彻底被services替代, service:负责调度controllerViewModel,通过router进行映射, view controller stack:负责...

    ios-ZZYWeiXinTakeMovie.zip

    仿微信拍摄小视频功能 有重拍功能,有对焦功能,可以设置拍摄多帧数和最长拍摄时间。 使用和设置如下: ...TakeMovieViewController *TMVC = ...[self.navigationController pushViewController:TMVC animated:YES];

    ios-LGLCalender.zip

    一款简单的日历,代码易懂,使用方便,... [self.navigationController pushViewController:ctl animated:YES]; // ================================= 结束使用 ===================================================

Global site tag (gtag.js) - Google Analytics