A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 崔石炫 中级黑马   /  2014-10-23 23:57  /  503 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. //  Person.h
  2. #import <Foundation/Foundation.h>

  3. @class Dog;
  4. @interface Person : NSObject

  5. @property(nonatomic , retain) NSString *name;
  6. @property(nonatomic , assign) int age;
  7. @property(nonatomic , retain) Dog *dog;

  8. + (id)person;

  9. @end
复制代码
  1. //  Person.m
  2. #import "Person.h"
  3. #import "Dog.h"

  4. @implementation Person

  5. + (id)person //快速构造器(便利构造器)
  6. {
  7.     return [[[self alloc] init] autorelease];
  8.     // * 有alloc  , 有release/autorelease
  9.     // NSString对象的创建过程没有手动alloc,所以无需release/autorelease
  10. }

  11. - (void)walkDog
  12. {
  13.     [_dog run];
  14. }

  15. - (void)dealloc
  16. {
  17.     NSLog(@"名为%@的人被回收" , _name);
  18.     [_dog release]; //对占用的对象做release操作
  19.     [super dealloc];
  20. }

  21. @end
复制代码
  1. //  Dog.h
  2. #import <Foundation/Foundation.h>

  3. @interface Dog : NSObject

  4. @property(nonatomic , assign) int age;

  5. + (id)dog;
  6. - (void)run;

  7. @end
复制代码
  1. //  Dog.m
  2. #import "Dog.h"

  3. @implementation Dog

  4. + (id)dog
  5. {
  6.     return [[[self alloc] init] autorelease];
  7. }

  8. - (void)run
  9. {
  10.     NSLog(@"跑跑跑");
  11. }

  12. - (void)dealloc
  13. {
  14.     NSLog(@"%d岁的狗被回收" , _age);
  15.     [super dealloc];
  16. }

  17. @end
复制代码
  1. //  main.m
  2. #import <Foundation/Foundation.h>
  3. #import "Dog.h"
  4. #import "Person.h"
  5. /*
  6. autorelease
  7. * 延迟release操作的时间
  8. * 不必关心alloc、release操作的顺序
  9. * 快速构造器:快速返回autorelease过的对象

  10. autoreleasepool
  11. * 可以嵌套使用
  12. * 自动释放池被销毁时,对池中所有对象做一次release操作

  13. 内存管理原则
  14. * 有alloc  , 有release/autorelease
  15. * 有retain , 有release
  16. * 不能重复调用release、autorelease,必须配对使用
  17. */

  18. int main(int argc, const char * argv[])
  19. {

  20.     @autoreleasepool {
  21.         Person *p = [Person person];
  22.         p.age = 15;
  23.         p.name = @"张三";
  24.         
  25.         Person *p2 = [Person person];
  26.         p2.age = 16;
  27.         p2.name = @"李四";
  28.         
  29.         Dog *d = [Dog dog];
  30.         d.age = 1;
  31.         
  32.         Dog *d2 = [Dog dog];
  33.         d2.age = 2;
  34.         
  35.         p.dog = d;
  36.         p.dog = d;
  37.         p2.dog = d2;
  38.         p2.dog = d2;
  39.         
  40.         p.dog = d2;
  41.         p2.dog = d;
  42.         
  43.     } //autoreleasepool被销毁,对池中所有对象做一次release操作
  44.     return 0;
  45. }
复制代码



0 个回复

您需要登录后才可以回帖 登录 | 加入黑马