zoukankan      html  css  js  c++  java
  • 便利构造器及相关问题

    便利构造器的概念:

    • 便利构造器是一种快速创建对象的方式。
    • 它本质上是把初始化方法做了一次封装,方便外界使用。
    • 便利构造器是一个类方法。
    • 通常以类名开头,返回值仍然是id类型。       

    1. 简述autorelease的对象是在什么时候被release的,简述NSAutoreleasePool的工作机制。

              autorelease的对象是延迟释放的,当池对象release或drain时,才被释放的。

    NSAutoreleasePool的工作机制:

    • 当创建的对象未来某个时候销毁时,可以使用对象的autorelease方法。
    • 对象将所有权交给最近的NSAutoreleasePool对象。
    • 当池对象drain或release时,会逐一对池内对象发送release消息。

     注:

    • autorelease的对象是延迟释放所有权。
    • 尽量不要使用autorelease,而是使用release。
    • autorelease的对象将所有权交给最近的NSAutoreleasePool对象,这些autorelease的对象在自动释放池中有着自己的队列,同样遵循栈空间中先进后出的规律:先创建的对象相对位于栈底,当池对象给池中所拥有的对象逐一发送release消息时,位于栈顶的先出栈。 

    2. for(int i = 0; i < largenumber; i++){

        Person *p = [Person person];

        [p study];

       }

            以上代码有什么问题,应该怎么去改?

            以上代码中,是用便利构造器的方式创建了p对象,这就意味着p是autorelease的,延迟释放会导致for循环中所占的内存不断积攒,当内存耗尽时,势必造成程序的崩溃。

            对于以上代码有三种修改方法:

    //方法一

    //在for循环内部添加自动释放池,出了自动释放池并将所拥有的对象释放掉。

    for(int i = 0; i < largenumber; i++){

            @autorelease{

        Person *p = [Person person];

        [p study];

            }

    }

    注:

    • 便利构造器的命名规范:必须以类名开头。
    • person的便利构造器为:[[[Person alloc]  init]  autorelease];   

    //方法二

    //用alloc  init的方式创建实例对象,同样在for循环内释放所拥有的对象。

    for(int i = 0; i < largenumber; i++){

        Person *p = [[Person alloc]  init];

        [p study];

            [p release];

    }

    //方法三

    //创建一个自动释放池,在自动释放池的生命周期内操作对象。

    for(int i = 0; i < largenumber; i++){

         NSAutoreleasePool *pool = [[NSAutoreleasePool  alloc]  init];

           Person *p = [[Person person];

       [p study];

           [pool release]; 

    }

     

  • 相关阅读:
    MariaDB + Visual Studio 2017 环境下的 ODBC 入门开发
    CUDA 9.1/9.2 与 Visual Studio 2017 (VS2017 15.6.4) 的不兼容问题
    用 SDL2 在屏幕上打印文本
    用 SDL2 处理精灵图
    用 SDL2 进行事件驱动编程
    用 SDL2 加载PNG平铺背景并显示前景
    用 SDL2 平铺背景并显示前景
    用 SDL2 显示一张图片
    VPS 安全措施(CentOS 6)
    Hello World!
  • 原文地址:https://www.cnblogs.com/JoelZeng/p/3454762.html
Copyright © 2011-2022 走看看