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

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

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

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. 两个实用的Python的装饰器

    两个实用的Python的装饰器 超时函数 这个函数的作用在于可以给任意可能会hang住的函数添加超时功能,这个功能在编写外部API调用 .网络爬虫.数据库查询的时候特别有用 timeout装饰器的代码 ...

  2. sharepoint站点锁定后解锁

    MOSS站点备份过程中中断后导致整个站点处于锁定状态 其他的命令都无效,以下命令才解决问题 PS C:\Users\root> $Admin = new-object Microsoft.Sha ...

  3. win7的centos虚拟机上搭建mysql5.6服务

    1 安装包下载 mysql5.6下载地址: http://dev.mysql.com/downloads/mysql/ 这里选择linux版本: navicat11破解版的下载地址: http://d ...

  4. Cocos2d-JS v3.0 alpha

    Cocos2d-JS是整合了Cocos2d-html5 v3.0 alpha和Cocos2d-x JSBinding的新JS引擎仓库.整合之后的核心优势在于Html5和JSB的开发流程及API现在变得 ...

  5. 随手记录一个 firefox的backgroundPostion-x和-y的问题

    今天帮大师写了一天项目,后来在测试一个显示升序和降序的标签上面,我使用了一个backgroundPosition-y来判断当前icon的状态,却无法不管是使用闭包还是个钟手段,在 firefox下面总 ...

  6. pd虚拟机死机怎么解决

    最近在mac上使用pd虚拟机装win使用,今天发现pd中的win7虚拟机死机了,无论怎么点都没用,通过点击操作-关闭也不行,重启电脑也不行,后来找到一种办法可以重启虚拟机. 1.先通过菜单中止虚拟机, ...

  7. HD1046An Easy Task

    Problem Description Ignatius was born in a leap year, so he want to know when he could hold his birt ...

  8. svg base64

    好多h5页面有出现data:image/png;base64,后面跟了一串类似乱码的字母 查了下原来这也是svg或者是图片 <img src=“data:image/png;base64,iVB ...

  9. HDU1002大数加法

    大数加法 c++版: #include <map> #include <set> #include <stack> #include <queue> # ...

  10. SetTimer函数的用法

    什么时候我们需要用到SetTimer函数呢?当你需要每个一段时间执行一件事的的时候就需要使用SetTimer函数 了.使用定时器的方法比较简单,通常告诉WINDOWS一个时间间隔,然后WINDOWS以 ...