2个对象互相有着引用,A中有B,B中有A。

// 对于循环retain的情况,对象不能够释放,此时只能让一方使用assign一方使用retain,retain用于对象assign用于基本类型,assign时对cat的引用不会使cat对象计数器加1

  1. Cat.h
  2. #import <Foundation/Foundation.h>
  3. @class Girl;
  4. @interface Cat : NSObject
  5. @property (nonatomic,copy)NSString *name;
  6. @property (nonatomic,assign)int age;
  7. @property (nonatomic,retain)Girl *owner;
  8.  
  9. @end
  1. Cat.m
  2. #import "Cat.h"
  3. @implementation Cat
  4. - (void)dealloc
  5. {
  6. NSLog(@"猫被释放");
  7. [_owner release];
  8. [super dealloc];
  9. }
  10. @end
  11.  
  12. Girl.h
  13. #import <Foundation/Foundation.h>
  14. @class Cat;
  15. //@class Cat; // 仅仅告诉编译器cat是一个猫类,可以声明一个对象.
  16. // 建议:以后,头文件引入一个类的时候,建议使用@class
  17. // AimporB BimportC CimpotD:效率很低.
  18. @interface Girl : NSObject
  19. // 对于循环retain的情况,对象不能够释放,此时只能让一方使用assign,assign时对cat的引用不会使cat对象计数器加1
  20. @property (nonatomic,assign)Cat *cat;
  21. @end
  22.  
  23. Girl.m
  24. #import "Girl.h"
  25. @implementation Girl
  26. -(void)dealloc
  27. {
  28. NSLog(@"女孩被释放");
  29. [_cat release];
  30. [super dealloc];
  31. }
  32. @end
  33.  
  34. main.m
  35. #import <Foundation/Foundation.h>
  36. #import "Girl.h"
  37. #import "Cat.h"
  38. int main(int argc, const char * argv[]) {
  39. @autoreleasepool {
  40. Girl *g = [[Girl alloc] init];
  41. Cat *c = [[Cat alloc] init];
  42. g.cat = c; // 女孩对猫进行了一次retain,c对象计数器不加1,把c当做基本类型处理,c=1
  43. c.owner = g; // 猫对女孩进行了一次retain,g=2
  44. [g release];//g=1
  45. [c release];//c=1
  46. }
  47. return ;
  48. }
  1. /*
  2. 1.@class的使用
  3. 作用
  4. 可以简单地引用一个类
  5. 简单使用
  6. @class Dog; //类的引入,仅仅是告诉是一个类,不能用类里面的变量和方法,#import把类的变量和方法拷贝了,可以使用变量和方法
  7. 仅仅是告诉编译器:Dog是一个类;并不会包含Dog这个类的所有内容
  8. 具体使用:
  9. 在.h文件中使用@class引用一个类
  10. 在.m文件中使用#import包含这个类的.h文件
  11.  
  12. 通常引用一个类有两种办法:
  13. 一种是通过#import方式引入;
  14. 另一种是通过@class引入;
  15. 这两种的方式的区别在于:
  16. 1)#import方式会包含被引用类的所有信息,包括被引用类的变量和方法;@class方式只是告诉编译器在 A.h文件中 B *b只是类的声明,具体这个类里有什么信息,这里不需要知道,等实现文件中真正要用到时,才会真正去查看B类中信息;
  17. 2)使用@class方式由于只需要知道被引用类(B类)的名称就可以了,而在实现类由于要用到被引用类中的实体变量和方法,所以需要使用#import来包含被引用类的头文件;
  18. 3)通过上面2点也很容易知道在编译效率上,如果有上百个头文件都#import了同一个文件,或者这些文件依次被#improt(A->B, B->C,C->D...),一旦最开始的头文件稍有改动,后面引用到这个文件的所有类 都需要重新编译一遍,这样的效率也是可想而知的.而相对来讲,使用@class方式就不会出现这种问题了;
  19. 所以:我们实际开发中尽量在.h头文件中使用@class
  20. */

0c-33-@class,循环retain的更多相关文章

  1. 七.OC基础加强--1.内存管理 2.野指针,内存泄露 3.set方法的内存管理 4.@property参数 5.@class和循环retain的使用 6.NSString的内存管理

    1,内存管理简单介绍 1,为什么要有内存管理? malloc selloc dealloc```需要回头复习 一般的内存 4s 是512m内存:6 是1024m内存: 当内存过大时,会耗尽内存.出现程 ...

  2. 0c-41-ARC下循环引用问题

    1.ARC下循环引入问题 一个人拥有一只狗,一只狗拥有一个主人. 当增加d.owner = p;时形成循环引用. 解决方法:一端用strong,一端用weak. 2.ARC下@property参数 A ...

  3. iOS 非ARC基本内存管理系列 3-循环retain和@class

    1.@class 使用场景:对于循环依赖关系来说,比方A类引用B类,同时B类也引用A类: 可以看出Person和Card互相引用,此时如果使用#import编译报错!因此当使用@class在两个类中相 ...

  4. oc51--循环retain

    // main.m // 循环retain #import <Foundation/Foundation.h> #import "Person.h" #import & ...

  5. 200-Java语言基础-Java编程入门-004 | Java分支与循环

    一.流程控制语句 可以控制程序的执行流程 在程序开发的过程之中一共会存在有三种程序逻辑:顺序结构.条件分支(选择)结构.循环结构. 顺序结构的定义,即:所有的程序将按照定义的代码从上往下.顺序依次执行 ...

  6. 循环retian

    1.循环retian基本概念 循环retain的场景 比如A对象retain了B对象,B对象retain了A对象 循环retain的弊端 这样会导致A对象和B对象永远无法释放 循环retain的解决方 ...

  7. iOS项目开发中的知识点与问题收集整理②(Part 二)

    1.点击UIButton 无法产生触摸事件    如果在UIImageView中添加了一个按钮,你会发现在默认情况下这个按钮是无法被点击的,需要设置UIImageView的userInteractio ...

  8. ios开发学习笔记(这里一定有你想要的东西,全部免费)

    1,Search Bar 怎样去掉背景的颜色(storyboard里只能设置background颜色,可是发现clear Color无法使用). 其实在代码里还是可以设置的,那就是删除背景view [ ...

  9. iOS-OC内存管理

    目标 1.[理解]内存管理 2.[掌握]第一个MRC程序 3.[掌握]内存管理的原则 4.[理解]野指针与僵尸对象 5.[理解]单个对象的内存管理 6.[理解]多个对象的内存管理 7.[掌握]set方 ...

随机推荐

  1. 使用android SpannableStringBuilder实现图文混排

    项目开发中需要实现这种效果 多余两行,两行最后是省略号,省略号后面是下拉更多 之前用过的是Html.fromHtml去处理图文混排的,仅仅是文字后图片或者文字颜色字体什么的, 但是这里需要在最后文字的 ...

  2. kali系统安装图文教程

    工具和原料 1.虚拟机:Oracle VM VirtualBox 下载地址:https://www.virtualbox.org/wiki/Downloads 根据你自己的计算机操作系统下载,其中如果 ...

  3. TCP包头

    每发一个包,不论大小协议头会占用一定的空间 TCP头20字节,IP头20字节,MAC头14字节,共54字节 //Mac头部,总长度14字节  typedef struct _eth_hdr  {    ...

  4. jQuery Callback 函数

    @(编程) Callback 函数在当前动画 100% 完成之后执行. jQuery 动画的问题 许多 jQuery 函数涉及动画.这些函数也许会将 speed 或 duration 作为可选参数. ...

  5. JS中如何判断null、undefined与NaN

    1.判断undefined: <span style="font-size: small;">var tmp = undefined; if (typeof(tmp)  ...

  6. c# 解决IIS写Excel的权限问题

    c# 解决IIS写Excel的权限问题 from: http://www.jb51.net/article/31473.htm 发布:mdxy-dxy 字体:[增加 减小] 类型:转载 使用以上方法必 ...

  7. bmp格式解析

    最近一直在写图像处理的作业,好多啊 bmp格式简介 a.格式组成 1:位图头文件数据结构,它包含BMP图像文件的类型.显示内容等信息: 2:位图信息数据结构,它包含有BMP图像的宽.高.压缩方法,以及 ...

  8. [LeetCode] Consecutive Numbers 连续的数字 --数据库知识(mysql)

    1. 题目名称   Consecutive Numbers 2 .题目地址 https://leetcode.com/problems/consecutive-numbers/ 3. 题目内容 写一个 ...

  9. java懒汉式单例遇到多线程

    单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例. 在计算机系统中,线程池.缓存.日志对象.对话框.打印机.显卡的驱动程序对象常被设计成单例.这些应用都或多或少具有资源管理器的功 ...

  10. spring 切面 前置后置通知 环绕通知demo

    环绕通知: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http:// ...