便利构造器及相关问题

便利构造器的概念:

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

}

 

 

 

 

 

 

 

 

 

posted @ 2013-12-02 21:58  Joel Zeng  阅读(446)  评论(0编辑  收藏  举报