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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© dawn.dai 中级黑马   /  2014-4-21 20:26  /  1002 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 dawn.dai 于 2014-4-21 21:13 编辑

今天在看oc视频时说类循环调用时 .h 文件用@class,而且一端用retain,另一端用assign,但之前的视频中说oc对象要用retain,其他类型用assign,现在这样用不是矛盾了吗,明明是两个类对象啊,哪位大神解释下呗?

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

2 个回复

倒序浏览
1,@class的使用场景:对于循环依赖关系来说,比如A类引用B类,同时B类也引用A类。当使用@class在两类相互声明,就不会出现编译报错。使用 @class 类名; 就可以引用一个类,说明一下它是一个类,
@class的作用:仅仅告诉编译器,某个名称是一个类
2,如果a对象retain了b对象,b对象也retain了对象,这样会导致a对象和b对象永远都无法释放。
解决办法:当两端相互引用时,一端用retain,一端用assign。(这里可以理解为class也是一种类型,它是类对象的类型,这样使用assign就不会不明白了吧。)
  1. //Card类的声明
  2. @class Person;
  3. @interface Card : NSObject
  4. @property (nonatomic, assign) Person *person;
  5. @end
  6. //Person类的声明
  7. @class Card;
  8. @interface Person : NSObject
  9. @property (nonatomic, retain) Card *card;
  10. @end
复制代码

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

回复 使用道具 举报
之前视频中讲的是如果在一个类中定义一个类类型变量时用retain,指的是在引用的时候会有一个相对应的指针指向该对象,而在循环引用的时候,两个类中都存在对方的累类型变量,这样相互引用会使两个对象的计数器永远变不了0,造成无法释放内存的情况产生。
解决该类循环引用问题的方法就是一个用retain一个用assign。
指针分为两种,一种为强指针,一种为弱指针。
一般情况下默认的是弱指针。
在这里一个用retain是指的用强指针指向该引用的累类型变量
而用assign表示的是用弱指针指向该累类型变量。
弱指针指的是在指向对象时相当于该对象计数器不增加。
这样的话在循环引用时就不会产生相互计数器+1,同时就可以让一个对象的计数器可以变为0.
当这个计数器为0的对象释放之后,对应的对象计数器也会表位变为0.
这样两个对象就会都能释放。
这样就不会产生内存不能释放的情况产生。

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马