黑马程序员技术交流社区

标题: OC学习笔记09--OC中内存管理ARC机制 [打印本页]

作者: wowthe1st    时间: 2015-8-3 14:07
标题: OC学习笔记09--OC中内存管理ARC机制
适合有java与C基础同学迅速了解OC
  1. #import <Foundation/Foundation.h>
  2. @class ClassB;


  3. //ClassA
  4. @interface ClassA :NSObjcet

  5. //ARC机制下,retain参数不可用,改成strong
  6. @property (nonatomic,strong) ClassB b;
  7. //非OC对象仍然使用assign
  8. @property (nonatomic,assign) int count;

  9. @end

  10. @implementation ClassA

  11. - (void)dealloc
  12. {
  13.         NSLog(@"%@ deallocated",[self className]);
  14.         //dealloc中无法调用[super dealloc]
  15. }
  16. @end


  17. //ClassB
  18. @interface ClassB :NSObject
  19. // 一方使用弱引用解决循环retain的问题
  20. @property (nonatomic,weak) ClassA a;
  21. @end

  22. @implementation ClassB
  23. - (void)dealloc
  24. {
  25.         NSLog(@"%@ deallocated",[self className]);
  26.        
  27. }
  28. @end

  29. int main()
  30. {
  31.         //ARC机制下无法使用任何内存管理相关方法与对象
  32.        
  33.         ClassA *a=[[ClassA alloc] init];
  34.         ClassB *b=[[ClassB alloc] init];
  35.         [a setB:b];[b setA:a];
  36.        
  37.         return 0;
  38. }
复制代码






OC中ARC机制:
        ARC为编译器特性,不同于java中GC为运行时特性;
ARC回收对象的原则:
        无强指针指向对象,则release;
        强指针:__strong TYPE *p 为强指针,默认声明的所有指针都是强指针
        弱指针:__weak Type *p 为弱指针,弱指针在指向的对象被销毁后会自动置零       

使用ARC与不用代码上的区别:
        1>ARC机制下,代码中无法使用任何内存管理相关的方法(retain,release,autorelease 等)
                        及对象(NSAutoreleasePooll 等),但是并非程序不使用内存管理功能,而是
                        内存管理代码由compiler在compile期间自动添加,无需开发人员参与内存管理;
        2>ARC机制下,对象的setter无法使用retain,即@property中无法使用retain参数,
                        改用strong与weak表示强引用或是弱引用(适用OC对象,其他数据类型仍然使用assign)
                        例:@property (nonatomic,strong) NSObject * obj;
                        ARC机制下循环retain问题解决方式:一方使用strong,另一方使用weak
        3>ARC机制下,重写的dealloc方法中无法再调用[super dealloc];
       
项目中部分文件使用ARC,部分不使用情况,可以给项目文件设置如下参数,告诉编译器是否使用ARC机制进编译:
        -fno-objc-arc 不使用ARC编译
        -f-objc-arc 使用ARC编译







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