黑马程序员技术交流社区

标题: 二战黑马:ARC_strong、weak [打印本页]

作者: 崔石炫    时间: 2014-10-23 23:55
标题: 二战黑马:ARC_strong、weak
  1. //  Person.h
  2. #import <Foundation/Foundation.h>

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

  5. @property(nonatomic , strong) Card *card;

  6. + (id)person;

  7. @end


  8. //  Person.m
  9. #import "Person.h"
  10. #import "Card.h"

  11. @implementation Person

  12. + (id)person // 便利构造器
  13. {
  14.     return [[self alloc] init]; //使用self的好处:方便子类调用父类的快速构造器,返回子类对象
  15.     //return [[Person alloc] init]; //这样写的话,就写死了,子类调用此构造器返回的是父类对象,违背多态的思想
  16. }

  17. - (void)dealloc
  18. {
  19.     NSLog(@"人对象被回收");
  20. }

  21. @end
复制代码

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

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

  5. @property(nonatomic , weak) Person *owner;

  6. + (id)card;

  7. @end


  8. //  Card.m
  9. #import "Card.h"
  10. #import "Person.h"

  11. @implementation Card

  12. + (id)card
  13. {
  14.     return [[self alloc] init]; //写self而不是Card,利于多态
  15. }

  16. - (void)dealloc
  17. {
  18.     NSLog(@"身份证对象被回收");
  19. }

  20. @end
复制代码
  1. //  Student.h
  2. #import "Person.h"

  3. @interface Student : Person

  4. @end

  5. //  Student.m
  6. #import "Student.h"

  7. @implementation Student

  8. - (void)dealloc
  9. {
  10.     NSLog(@"学生对象被回收");
  11. }

  12. @end
复制代码
  1. //  main.m
  2. #import <Foundation/Foundation.h>
  3. #import "Person.h"
  4. #import "Student.h"
  5. #import "Card.h"

  6. /*
  7. ARC机制的原理:只要没有强指针指向对象,系统自动回收对象所占内存

  8. ARC注意点:
  9. * 循环引用:一端用strong,另一端用weak
  10. * 重写dealloc方法:不能调用super的dealloc方法
  11. * 禁用retainCount、retain、release、autorelease等与内存管理相关的方法

  12. */

  13. int main(int argc, const char * argv[])
  14. {

  15.     @autoreleasepool {
  16.      
  17.         Student *s = [Student person]; //调用父类的快速构造器
  18.         Card *c = [Card card];
  19.         
  20.         //NSLog(@"%ld" , [s retainCount]); //ARC禁用retainCount、retain、release、autorelease等与内存管理相关的方法
  21.         
  22.         s.card = c;
  23.         c.owner = s;
  24.         
  25.         __strong Card *c2 = [Card card];
  26.         
  27.         c2 = nil; //强指针置为空指针,Card对象立马被回收
  28.       
  29.     }
  30.     return 0;
  31. }
复制代码








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