黑马程序员技术交流社区

标题: OC学习笔记08--autorelease和autoreleasepool [打印本页]

作者: wowthe1st    时间: 2015-8-3 13:16
标题: OC学习笔记08--autorelease和autoreleasepool
本帖最后由 wowthe1st 于 2015-8-3 13:20 编辑

适合有java和C基础的同学迅速了解OC
  1. #import <Foundation/Foundation.h>

  2. // Bird
  3. @interface Bird :NSObject
  4. @property (nonatomic,assign,getter=isFlyable) BOOL flyable;

  5. - (id)initWithFlyable:(BOOL)flyable;

  6. + (id)bird;
  7. + (id)birdWithFlyable:(BOOL)flyabe;
  8. + (id)birdWithFlyable2:(BOOL)flyable;

  9. @end

  10. @implementation Bird

  11. - (void)dealloc
  12. {
  13.         // 利用self,可知道当前被销毁的对象是本类还是子类
  14.         NSLog(@"%@ deallocated",[self className]);
  15.         [super dealloc];
  16. }

  17. //构造方法
  18. - (id)initWithFlyable:(BOOL)flyable
  19. {
  20.         if(self=[super init])
  21.         {//使用set方法赋值方便内存管理
  22.                 [self setFlyable:flyable];
  23.         }
  24.         return self;
  25. }

  26. //提供类方法便捷创建autorelease过的对象(并非构造方法)
  27. + (id)bird
  28. {
  29.         // 灵活利用self,可以方便子类使用该方法创建子类对象
  30.         return        [[[self alloc] init] autorelease];
  31. }
  32. + (id)birdWithFlyable:(BOOL)flyable
  33. {
  34.         Bird *b=[self bird];
  35.         [b setFlyable:flyable];
  36.         return b;
  37. }

  38. // 两种类型根据参数创建autorelease过的对象
  39. + (id)birdWithFlyable2:(BOOL)flyable
  40. {
  41.         return        [[[self alloc] initWithFlyable:flyable] autorelease];
  42. }

  43. @end


  44. //Penguin
  45. @interface Penguin :Bird

  46. @property (nonatomic,retain) NSString *descript;

  47. - (id)initWithFlyable:(BOOL)flyable andDescript:(NSString *)descript;

  48. + (id)penguinWithFlyable:(BOOL)flyable andDescript:(NSString *)descript;
  49. @end

  50. @implementation Penguin

  51. - (void)dealloc
  52. {
  53.         //释放retain的对象
  54.         [_descript release];
  55.         [super dealloc];
  56. }


  57. - (id)initWithFlyable:(BOOL)flyable andDescript:(NSString *)descript
  58. {
  59.         if(self=[super initWithFlyable:flyable])
  60.         {
  61.                 // 使用set方法进行赋值,方便内存管理;
  62.                 [self setDescript:descript];
  63.         }
  64.         return self;
  65. }

  66. // 重写输出方法
  67. - (NSString *)description
  68. {
  69.         //此种方式创建的NSString对象为autorelease过的
  70.         return [NSString stringWithFormat:@"flyable=%d,descript=%@",[self isFlyable],_descript];
  71. }

  72. + (id)penguinWithFlyable:(BOOL)flyable andDescript:(NSString *)descript
  73. {
  74.         Penguin *p=[super birdWithFlyable:flyable];
  75.         [p setDescript:descript];
  76.         return p;
  77. }
  78. @end

  79. int main()
  80. {
  81.         NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init];
  82.         
  83.         
  84.         // 该方法创建的OC字符串为autorelease过
  85.         NSString *descript=[NSString stringWithFormat:@"%@ cannot fly",[Penguin className]];
  86.         
  87.         // 调用autorelease后将对象加入栈顶池中
  88.         Penguin *p1=[[[Penguin alloc] initWithFlyable:NO andDescript:descript] autorelease];
  89.         
  90.         // 自动释放池可嵌套,最后创建的放栈顶,将最先被销毁
  91.         NSAutoreleasePool *pool2=[[NSAutoreleasePool alloc] init];
  92.         
  93.         Penguin *p2=[Penguin penguinWithFlyable:NO andDescript:descript];
  94.         
  95.         Penguin *p3=[Penguin birdWithFlyable:NO];
  96.         
  97.         [p3 setDescript:descript];
  98.         
  99.         NSLog(@"p2::%@",p2);
  100.         NSLog(@"p3::%@",p3);
  101.         
  102.         // pool2 释放,等同于[pool2 release];
  103.         [pool2 drain];
  104.         
  105.         NSLog(@"p1::%@",p1);
  106.         
  107.         
  108.         
  109.         [pool drain];
  110.         
  111.         return 0;
  112. }
复制代码

autorelease 方法:
        1>返回对象本身
        2>将对象放到autoreleasepool中
        3>当autoreleasepool销毁,对池中所有对象调用一次release

        autoreleasepool两种创建方式:
                1>IOS 5.0前
                                NSAutoreleasePool *pool=        [[NSAutoreleasePool alloc] init];
                                        //autorelease调用区域
                                [pool drain];// 或 [pool release];
                2>IOS 5.0后                @autoreleasepool{......}

                autoreleasepool特点:
                        1>池子是存放在一个栈结构的对象中,嵌套创建的多个池子,先创建的池子后被销毁
                        2>调用autorelease方法后,将对象放入该栈顶端的池子
                        3>池子在{}中代码执行结束后销毁,若是IOS 5.0前,则调用[pool drain]后销毁


        优点:不用关心对象release时间
       缺点:对象释放不及时,影响性能,大内存对象不要使用


        方法命名规范:
        系统自带类中创建对象的类方法里没包含alloc、new、copy字眼的,基本返回的对象都是autorelease的,
        开发中也可以使用这种方式,提供 创建autorelease过的对象 的类方法来便捷创建对象,
        这里一般使用[self alloc]创建,方便子类同样使用该方法也能创建子类对象;

       类命名规范:
        OC中无java 包名.类名 的方式来防止类名重复问题,使用类名加前缀的方式来避免类名重复;


作者: wowthe1st    时间: 2015-8-3 13:19
晕,不知道前面老出现size=XXX这个怎么解决
作者: 我丶就这样    时间: 2015-8-3 16:48
围观学习!!!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2