• 小记 iOS 视图控制器的内存申请与释放普遍规则 不及格的程序员


    作者:不及格的程序员-八神

    内存管理在iOS程序开发扮演非常重要角色,对这块处理不好的程序会在实际设备上发生Crash情况.
    对于经常在视图控制器中用retain声名的输出口一定要注意,在dealloc中release它们.
    Obj-C声明的属性,具有如下特性,将新对象赋值当前属性,并自动释放属性中的旧对象.

    1. 在appDelegate.m中如果有一个window输出口,或者另外加了一个导航视图控制器或是其它什么视图控制器时,在 dealloc 方法中,执行这些输出口的release方法.而不必在applicationDidFinishLaunching中执行释放.
    2. 在单独的自定义视图控制器中,如果在接到内存紧缺通知时,会执行didReceiveMemoryWarning方法,它会卸载当前视图窗体,并执行viewDidUnload方法,所以在该方法中将方视图中的定义的输出口置为nil. 同时在该视图的dealloc方法(当该视图控件器的release被调用时,该方法被执行)中执行相应的输出口release方法.  
      -(void)viewDidUnload
      {
      self.
      ** = nil;
      }

      -(void)dealloc
      {
      [
      ** release];
      [supper dealloc];
      }
    3. 实例方法,静态方法,工厂方法返回的对象的释方规则,后两者都不必手动执行release方法,由系统的内存池自动维护.
    4. 如果我在appDelegate.m文件中alloc并init一个视图控制器,然后把它通过导航控制器的initWithRootViewController方法加到其中时,那么加完之后要释放那个视图控制器.Example:  
      myController = [[*** alloc] initWithNibName:"***" bundle:nil];
      UINavigationController
      *navi = [[UINavigationController alloc] initWithRootViewController:myController];
      [myController release];
      [tabController presentModalViewController:navi animated:YES];
      [navi release];
    5. 在自定义视图控制器中声明了变量,但是没定义相应属性,这时对象释放规则同第1条相同.
      @interface *** : UIViewController
      {
      UIView
      *_view;
      }
      @end

      @implementation
      ***
      -(void)loadView
      {
      [supper loadView];
      _view
      = [[UIView alloc] initWithFrame:[self.view bounds]];
      [self.view addSubview:_view];
      }

      -(void)dealloc
      {
      [_view release];
      [supper dealloc];
      }
      @end
    6. 在iPhone3开发基础教程中的样例切换视图的代码问题,我觉得里面有一个顺序写错了,之后我在google查了一下,有不少人有同问.
      @implementation SwitchViewController
      @synthesize blueViewController;
      @synthesize yellowViewController;

      - (void)viewDidLoad
      {
      BlueViewController
      *blueController = [[BlueViewController alloc] initWithNibName:@"BlueView" bundle:nil];
      self.blueViewController
      = blueController;
      [self.view insertSubview:blueController.view atIndex:
      0];
      [blueController release];
      }

      - (IBAction)switchViews:(id)sender
      {
      [UIView beginAnimations:@"View Flip" context:nil];
      [UIView setAnimationDuration:1.25];
      [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];

      if (self.yellowViewController.view.superview == nil)//这条语句是最有趣的,OBJ-C允许向nil发送消息.
      {
      if (self.yellowViewController == nil)
      {
      YellowViewController
      *yellowController =
      [[YellowViewController alloc] initWithNibName:
      @"YellowView"
      bundle:nil];
      self.yellowViewController
      = yellowController;
      [yellowController release];
      }
      [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:self.view cache:YES];
      [blueViewController viewWillAppear:YES];
      [yellowViewController viewWillDisappear:YES];
      [blueViewController.view removeFromSuperview];
      [self.view insertSubview:yellowViewController.view atIndex:
      0];
      [yellowViewController viewDidDisappear:YES];
      [blueViewController viewDidAppear:YES];
      }
      else
      {
      if (self.blueViewController == nil)
      {
      BlueViewController
      *blueController =
      [[BlueViewController alloc] initWithNibName:
      @"BlueView"
      bundle:nil];
      self.blueViewController
      = blueController;
      [blueController release];
      }
      //[UIView setAnimationTransition:
      // UIViewAnimationTransitionFlipFromLeft
      // forView:self.view cache:YES];

      //[yellowViewController viewWillAppear:YES];
      //[blueViewController viewWillDisappear:YES];
      [yellowViewController.view removeFromSuperview];
      [self.view insertSubview:blueViewController.view atIndex:
      0];
      //[blueViewController viewDidDisappear:YES];
      //[yellowViewController viewDidAppear:YES];
      }
      //[UIView commitAnimations];
      }


      - (void)didReceiveMemoryWarning
      {
      [super didReceiveMemoryWarning];
      if (self.blueViewController.view.superview == nil)
      self.blueViewController
      = nil;
      else
      self.yellowViewController
      = nil;
      }


      - (void)dealloc
      {
      [yellowViewController release];
      [blueViewController release];
      [super dealloc];
      }

      @end
    7.   都在dealloc中执行.我看到在wordPress的iPhone客户端这样做的,不过好像它在特意兼容iOS3之前的版本,3.0之前的版本并不存在viewDidUnload方法,苹果的开发手册上有描述.    
      -(void)dealloc
      {
      [myView release], myView
      = nil;
      }

      附.
      python /Users/yangiori/Downloads/facebook-three20-309d34e/src/scripts/ttmodule.py -p /Users/yangiori/Documents/iPhoneLiaoBao/iPhoneLiaoBao.xcodeproj Three20 //区分大小写。。。

    南来地,北往的,上班的,下岗的,走过路过不要错过!

    ======================个性签名=====================

    之前认为Apple 的iOS 设计的要比 Android 稳定,我错了吗?

    下载的许多客户端程序/游戏程序,经常会Crash,是程序写的不好(内存泄漏?刚启动也会吗?)还是iOS本身的不稳定!!!

    如果在Android手机中可以简单联接到ddms,就可以查看系统log,很容易看到程序为什么出错,在iPhone中如何得知呢?试试Organizer吧,分析一下Device logs,也许有用.

    我的开发工具

    对于博客园里的网友,不敢称为叫"程序员"的人,你们攻击性太强,看来你们是不会想到我的用意的.园子里有不少人都非常喜欢Jeffrey,是因为它的第一版 框架设计 CLR via C#.
    可是从第一版到现在的第三版,没有看到真正底层的东西,内容仅仅是比MSDN文档更丰富一些,可能是我的要求太高了吧.
    也就是因为它很多时候会接触到微软开发人员,会经常聊聊某些问题而已,而它又将这些问题反应到书中.也许它就像一个小记者.
    它的年龄大我们不多,我的孩子与它小儿子一般大,如果我能向它那样出入微软与它们开发人员长时间交流,不仅仅会牛成它这样.....
    可是微软的开发人员不会扔太多时间在它这儿的.所以它会整天追着这个,赶它那个..屁颠个不停吧...
    而它的另一版被称为好书的 Windows核心编程,更是没有什么深度可言,仅仅是将windows提供的api,以及内核功能再重申了一遍.
    这些书对晋及编程知识是有些贡献的,再说一遍我不是在匾低谁,说说想法而已.

  • 相关阅读:
    git stash 一个场景 mark
    sendBeacon 使用
    【踩坑笔记】layui之单选和复选框不显示
    wordpress后台管理超时没反应:load-scripts.php载入缓慢出错
    MySQL_Sql_打怪升级_进阶篇_测试: SQL随机生成测试数据
    MySQL_Sql_打怪升级_进阶篇_测试: 游标应用
    MySQL8.0新特性_01_JSON数据格式的支持
    MySQL_Sql_打怪升级_进阶篇_进阶19: 函数
    MySQL_Sql_打怪升级_进阶篇_进阶18: 存储过程
    MySQL_Sql_打怪升级_进阶篇_进阶17: 变量
  • 原文地址:https://www.cnblogs.com/ioriwellings/p/1967656.html
Copyright © 2020-2023  润新知