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]; 

    }

     

  • 相关阅读:
    页面跳转方式
    银行账号每4位插入一个空格
    .net 对称加密
    .net 非对称加密
    webpack-dev-server的cli使用
    你不能不知道的 6 个 Web 开发者工具
    String字符串提取指定内容
    SQLServer 复制表结构
    关于OMAPL138烧写程序的说明
    C程序结构
  • 原文地址:https://www.cnblogs.com/JoelZeng/p/3454762.html
Copyright © 2011-2022 走看看