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

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

阅读更多

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

例子:
MyViewController *sampleViewController = [[[MyViewController allocinitWithXXX]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 allocinitWithTarget:selfaction:@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` 方法是 `UINavigationController` 的核心方法之一,用于将一个新的视图控制器推入导航控制器的堆栈,从而在屏幕上显示该视图控制器。下面我们将深入探讨 `pushViewController` 的工作原理、...

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

    在这个`IOS pushViewController实例`中,我们可能创建了一个自定义的UIViewController子类,用于展示百度地图。首先,确保已经在项目中集成百度地图SDK,并且在目的地视图控制器中设置了地图视图。 为了实现滑动...

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

    - 在使用`pushViewController`时,确保新的控制器已经加载了视图,否则可能会出现问题。 - 当导航栈为空时,不能调用`popViewController`或`pushViewController`,否则会抛出异常。 - 动画效果可以自定义,例如调整...

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

    `pushViewController:animated:` 方法是`UINavigationController`中的一个核心函数,它允许我们将一个新的视图控制器推入导航控制器的堆栈,从而实现屏幕间的平滑过渡。然而,在复杂的应用场景中,我们可能需要在...

    点击列表出现详情(简单的列表分组)

    在iOS开发中,创建一个“点击列表出现详情”的功能是一项常见的任务,这通常涉及到UITableView或者UICollectionView的使用。在这个场景中,“简单的列表分组”意味着我们可能会使用section来组织数据,而“点击每一...

    IOS应用源码之很炫的底部导航 .rar

    4. **Auto Layout**: 为了适应不同屏幕尺寸,源码中可能包含了使用Auto Layout来定义各个元素的约束,确保底部导航栏在各种设备上都能正确显示。 5. **UIAppearance**: 可能使用`UIAppearance`协议来统一设置全局的...

    IOS应用源码之IOS多功能页面活动项目.zip

    12. **错误处理**:良好的错误处理机制是任何项目的关键,可能会看到try-catch语句,或者使用Swift的do-catch块来捕获并处理可能出现的错误。 这个项目提供了学习iOS开发的实战机会,你可以深入研究源代码,理解每...

    ios-控制器跨级跳转.zip

    4. **pushViewController:animated:completion:**:在某些情况下,你可能需要在推送操作完成后执行某些操作,这时可以使用带completion block的方法。 5. **unwindSegue**:对于复杂的导航结构,可以使用 unwind ...

    ios-选择哪个View.zip

    开发者会根据用户的选择,使用pushViewController:animated:或者present:animated:completion:方法将新的视图控制器推入导航栈或模态展示,使得用户点击的页面出现在界面上方。 在压缩包内的"selectView"文件可能是...

    swift-iOSViewController间切换的转场动画

    Swift语言提供了丰富的工具和库来实现各种复杂的动画效果,其中`XLBubbleTransition`是一个专门为UINavigationController设计的转场动画库。这个库使得在ViewController间的Push和Pop操作时,可以呈现出独特的气泡...

    导航ios 源码

    “导航ios 源码”很可能是包含了一个实现良好导航功能的iOS项目,开发者可以通过分析和学习这个源码,深入理解导航的各个方面,包括如何设置导航控制器、如何使用UIStoryboardSegue、自定义导航栏以及实现各种过渡...

    类似iOS导航效果的框架

    5. 响应式设计:为了适配各种屏幕尺寸和设备方向,框架可能包含了对Auto Layout或Size Classes的支持,确保导航效果在不同设备上都能良好呈现。 6. 回弹效果(Springiness):类似于苹果原生的弹性效果,框架可能...

    ios-push控制器, 当前导航栏隐藏, 下个控制器导航栏显示.zip

    标题"ios-push控制器, 当前导航栏隐藏, 下个控制器导航栏显示.zip"所描述的问题,正是关于这个特定的场景,即如何在push操作中避免导航栏在切换过程中出现闪现的现象。 在描述中提到的"中间push闪现的问题"是指在从...

    IOS7 UINavigationController滑动Demo

    "IOS7 UINavigationController滑动Demo"就是针对这一功能的示例项目,旨在解决在pushViewController后,用户可以在新的页面上通过滑动来返回前一个页面的问题。 在iOS 7中,苹果对UINavigationController的滑动手势...

    IOS应用源码——按钮式导航.zip

    这些事件可以触发视图控制器的切换,比如使用`pushViewController:animated:`或`popViewController:animated:`方法。此外,为了实现更复杂的导航逻辑,开发者可能还会用到`Storyboard`中的` segues`,这是一种连接...

    IOS应用源码——Navigation + 分組tableView的DemoNavigation 2.zip

    6. **pushViewController**:当用户点击TableView中的某个单元格时,可能通过Navigation Controller的pushViewController:animated:方法来跳转到新的ViewController。 通过学习这个示例,开发者可以更好地理解和...

    iOS游戏应用源代码——junpluse-JTStackController-628e827.zip

    这些方法可能包括`pushViewController:animated:`、`popViewController:animated:`等,这些都是实现导航功能的核心方法。同时,JTStackController可能会有自己独特的手势识别机制,以便用户可以通过滑动等手势来切换...

    ios-PushPop.zip

    在这些文件中,我们可能还会看到如何集成这些自定义动画到Navigation Controller的方法,比如使用`pushViewController:animated:`和`popViewControllerAnimated:`方法的代理或者 Category 来实现。 为了实现这些...

    HHTransition:主流转场动画,无侵入,API简单易用

    主流转场动画 1,HHTransition优势 1,API只有两个方法,易调用2,面向切面编程,无侵入,不需要在VC中设置代理3,易扩展,只需要重建转场对象即可 ...- ( void )hh_pushViewController:(UIViewCon

Global site tag (gtag.js) - Google Analytics