Objective-C(3)对象间的has a关系---复合关系

  • 什么是复合关系?

类的复合关系是类的关系中最常见的一种。

复合是 has a 的关系,如Person类中包含一个成员属性,Book对象,Person has a Book。

  • 复合关系的实现

OC中要求,所有对象都以指针的形式引用,所以这种关系应体现为:

Person类的对象中包含一个Book对象的地址。

图上所示,包含了三个对象:

Person对象(由new方法创建而来)

NSString对象(字符串对象的字面值@"张三"赋值)

Book对象 (由new方法创建而来)

  • 复合关系的内存情况

显然,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
时间: 2024-12-17 22:55:15

Objective-C(3)对象间的has a关系---复合关系的相关文章

依赖注入与对象间关系

依赖注入(DI)是控制反转(IoC)的一种方式.目前,在.NET和Java领域已经有相当多基于DI思想的对象容器,如:Spring,Unity等.本文试图避免重复性地介绍DI基础知识和DI容器的使用,而是希望深一层探讨DI的本质和对象间关系,以达到合理设计避免滥用DI的目的. 依赖注入 vs 创建对象 有不少地方这样描述:"依赖注入改变了使用对象前先创建的传统方式,而是从外部注入依赖的对象".这样的描述其实似是而非,先来看一个例子: interface ICar{     void R

第23条:通过委托与数据源协议进行对象间通信

第4章:协议与分类 Objective-C 语言有一项特性叫做"协议"(protocol),它与 Jave 的 "接口"(interface)类似.Objective-C 不支持多重继承,因而我们把某个类应该实现的一系列方法定义在协议里面.协议最为常见的用途是实现委托模式,不过也有其他用法.理解并善用协议可令代码变得更易维护,因为协议这种方式能很好的描述接口. "分类"(category)也是 Objective-C 的一项重要语言特性.利用分类

第16课 Qt对象间的父子关系

1. Qt对象间的关系 (1)Qt对象间可以存在父子关系 ①每一个对象都保存有它所有子对象的指针 ②每一个对象都有一个指向其父对象的指针 (2)当指定Qt对象的父对象时 ①其父对象会在子对象链表中加入该对象的指针 ②该对象会保存指向其父对象的指针 (3)当Qt对象被销毁时 ①将自己从父对象的Children List移除 ②将自己的Children List中的所有对象销毁 ▲使用Qt开发时,不仅要时刻注意内存泄露的问题,还要时刻关注对象是否可能被多次销毁的问题. [编程实验]对象间的父子关系

13. 查看数据库对象间的依赖关系

在SQL Server中,(可编程)对象间的引用即依赖关系,有多种方式可以检查,随着版本变更,方式也有所不同. 父子关系的对象,不通过依赖关系来查询,比如: 1. 外键关系 use tempdb GO --drop table tb1,tb2 create table tb1 ( col1 int Primary key, col2 int ) insert into tb1 values (2,2),(3,2),(4,2),(5,2) GO create table tb2 ( col3 in

第23条:通过委托与数据源协议进行对象间通信

Objective-C语言特性:协议(protocol),它与Java的“接口”(interface)类似. Objective-C不支持多继承,但可以把类的实现方法定义在协议里面. 协议最为常见的用途是实现委托模式(Delegate pattern). 委托模式(Delegate pattern): 用来实现对象间的通信, 该模式的主旨是:定义一套接口,某对象若想授受另一个对象的委托,则需遵从此接口,以便成为其“委托对象”(delegate).而这“另一对象”则可以给其委托对象回传一些消息,也

让两个对象间建立weak关系

这是为了给两个对象间建立weak关系,当一个对象被释放时,另外一个对象再获取这个值时就是nil,也就是不持有这个对象:) 源码: WeakRelatedDictionary.h 与 WeakRelatedDictionary.m // // WeakRelatedDictionary.h // TestDemo // // Created by YouXianMing on 14-9-25. // Copyright (c) 2014年 YouXianMing. All rights reser

对象间引用赋值及方法时引用传递

考虑下面代码: class Program { static void Main(string[] args) { C c1 = new C(); c1.str = "hello"; C c2 = new C(); c2 = c1; //对象名即是对象引用,对象间赋值即是引用复制赋值,此时栈区的c2和c1同时指向堆区的同一块内存区域 Console.WriteLine(c1.str); Console.WriteLine(c2.str); c2.str = "world&qu

iOS开发————对象间通信之block

一.block的概念: 别称:代码段,块,闭包,是苹果公司添加到OC语言中的. 作用:在程序运行的过程中保存一段代码,并且这段代码可以进行传递. 应用:用于对象间的通信. 二.block的语法: 和函数指针的语法相似 要设定block的返回值和参数个数及类型. (1)定义: 无参无返回值的block变量:void (^myBlock)(void) 有参数有返回值的block变量 int (^sumBlock)(int, int); (2)赋值: myBlock = ^{ //block中的代码

7.QT-Qt对象间的父子关系

Qt对象之间可以存在父子关系 继承于QObject类或者其子类的对象,都称为Qt对象 当指定Qt对象的父对象时 需要通过setParent()成员函数来设置对象间的父子关系 子对象将会把自己的指针地址保存在父对象的children List链表里(因为父对象可以拥有多个子对象) 子对象内部会有一个指向其父对象的指针,可以通过parent()成员函数查看 代码试验 需要用到的函数: void QObject::setParent ( QObject * parent ); //设置为parent对