Objective-C(3)对象间的has a关系---复合关系
2016-02-27 16:19
330 查看
什么是复合关系?
类的复合关系是类的关系中最常见的一种。
复合是 has a 的关系,如Person类中包含一个成员属性,Book对象,Person has a Book。
复合关系的实现
OC中要求,所有对象都以指针的形式引用,所以这种关系应体现为:
Person类的对象中包含一个Book对象的地址。
![](http://s2.51cto.com/wyfs02/M00/7C/7C/wKiom1bRV6byR3ejAAFDC5LOVCM808.png)
图上所示,包含了三个对象:
Person对象(由new方法创建而来)
NSString对象(字符串对象的字面值@"张三"赋值)
Book对象 (由new方法创建而来)
复合关系的内存情况
![](http://s1.51cto.com/wyfs02/M01/7C/7B/wKioL1bRW8ySFn6MAAB9otZiE0Y576.png)
显然,p指针一定是函数或者方法中的局部变量,其内存使用的是栈控件
Objective-C中的所有对象一定是在堆中的,故三个对象Person、NSString、Book的内存都是堆空间的
Person、NSString、Book的内存空间并不是连续或互相包含的
Person has a NSString 表现为 Person对象中有NSString对象的地址
Person has a Book 表现为Person对象中有Book对象的地址
循环引用问题
如果出现两个类中属性互相复合时,头文件互相包含会出现循环引用的情况
在头文件中使用@class是声明被复合的类,在源文件再包含该类的头文件即可解决这个问题
类的复合关系是类的关系中最常见的一种。
复合是 has a 的关系,如Person类中包含一个成员属性,Book对象,Person has a Book。
复合关系的实现
OC中要求,所有对象都以指针的形式引用,所以这种关系应体现为:
Person类的对象中包含一个Book对象的地址。
![](http://s2.51cto.com/wyfs02/M00/7C/7C/wKiom1bRV6byR3ejAAFDC5LOVCM808.png)
图上所示,包含了三个对象:
Person对象(由new方法创建而来)
NSString对象(字符串对象的字面值@"张三"赋值)
Book对象 (由new方法创建而来)
复合关系的内存情况
![](http://s1.51cto.com/wyfs02/M01/7C/7B/wKioL1bRW8ySFn6MAAB9otZiE0Y576.png)
显然,p指针一定是函数或者方法中的局部变量,其内存使用的是栈控件
Objective-C中的所有对象一定是在堆中的,故三个对象Person、NSString、Book的内存都是堆空间的
Person、NSString、Book的内存空间并不是连续或互相包含的
Person has a NSString 表现为 Person对象中有NSString对象的地址
Person has a Book 表现为Person对象中有Book对象的地址
循环引用问题
如果出现两个类中属性互相复合时,头文件互相包含会出现循环引用的情况
在头文件中使用@class是声明被复合的类,在源文件再包含该类的头文件即可解决这个问题
//AMPerson.h @class AMBook; @interface AMPerson : NSObject { AMBook * book; } @end
//AMPerson.m #import "AMBook.h" @implementation AMPerson //... @end
//AMBook.h @class AMPerson; @interface AMBook : NSObject { AMPerson * person; } @end
//AMBook.h #import "AMPerson.h" @implementation AMBook //... @end
相关文章推荐
- Python动态类型的学习---引用的理解
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 不可修补的 iOS 漏洞可能导致 iPhone 4s 到 iPhone X 永久越狱
- iOS 12.4 系统遭黑客破解,漏洞危及数百万用户
- 每日安全资讯:NSO,一家专业入侵 iPhone 的神秘公司
- [转][源代码]Comex公布JailbreakMe 3.0源代码
- 土人系列AS入门教程 -- 对象篇
- 一个简单的asp数据库操作类
- C#托管堆对象实例包含内容分析
- C#实现用于操作wav声音文件的类实例
- C#类的多态性详解
- 在线管理数据库 类
- C#实现获取不同对象中名称相同属性的方法
- Lua面向对象之类和继承浅析
- Lua中类的实现原理探讨(Lua中实现类的方法)
- Lua中的类编程代码实例
- javascript asp教程第十一课--Application 对象
- C#常用目录文件操作类实例