利用delegate来解决类之间相互引用问题(引用死锁)

类之间相互引用--类A中需要调用类B中的方法,同时,类B中又要调用类A中的方法。(也被称为引用死锁,通常会出现编译错误)。

解决方法是,在类A中引用类B,并使类A成为类B的delegate,这样在类A中就可以调用类B中的方法,而在类B中可以设一个delegate属性,(这个delegate其实就是类A)就可以用[delegate msg]的方式来调用类A中的方法了。

具体实现如下:

** classA.h :

@interface ClassA<ClassBDelegate>

{
  ClassB *_B;
}

@property(retain)ClassB *B;

@end

** classA.m :

@implementation ClassA

@synthesize B = _B;

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
  self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];

  if (self)
  {
    // Custom initialization
    self.B = [[ClassB alloc] init];
    [self.B setDelegate:self];
  }

  return self;

}

// ClassB delegate method

- (void)delegateMethod
{
  NSLog(@"This is a delegate Method !");
}

@end

** classB.h :

@protocol ClassBDelegate;

@interface ClassB
{
  id<ClassBDelegate>delegate;
}

@property(retain,nonatomic)id<ClassBDelegate>delegate;

@end

@protocol ClassBDelegate

- (void)delegateMethod;

@end

** classB.m :

@implementation ClassB

.
.

- (void)runClassAMethod
{
  [delegate delegateMethod];
}

.
.
@end

利用delegate来解决类之间相互引用问题(引用死锁)

时间: 2024-10-05 06:37:40

利用delegate来解决类之间相互引用问题(引用死锁)的相关文章

ARC之解决闭包引起的循环强引用

copy自:swift2.0官方教程中文版---极客学院版 1.产生闭包之间的循环强引用 直接代码和上图: class HTMLElement { let name: String let text: String? lazy var asHTML: Void -> String = { if let text = self.text { return "<\(self.name)>\(text)</\(self.name)>" } else { retu

Java实现不同的类的属性之间相互赋值

在开发的时候可能会出现将一个类的属性值,复制给另外一个类的属性值,这在读写数据库的时候,可能会经常的遇到 ,特别是对于一个有继承关系的类的时候,我们需要重写很多多余的代码,下面有一种简单的方法实现该功能, 1.首先有两个类,两个类之间有相同的属性名和类型,也有不同的属性名很类型: public class ClassTestCopy2 { private int id; private String name; private String password; private String se

浅谈利用同步机制解决Java中的线程安全问题

我们知道大多数程序都不会是单线程程序,单线程程序的功能非常有限,我们假设一下所有的程序都是单线程程序,那么会带来怎样的结果呢?假如淘宝是单线程程序,一直都只能一个一个用户去访问,你要在网上买东西还得等着前面千百万人挑选购买,最后心仪的商品下架或者售空......假如饿了吗是单线程程序,那么一个用户得等前面全国千万个用户点完之后才能进行点餐,那饿了吗就该倒闭了不是吗?以上两个简单的例子,就说明一个程序能进行多线程并发访问的重要性,今天就让我们去了解一下Java中多线程并发访问这个方向吧. **第一

Cocos2dx 3.2 节点之间相互通信与设置触摸吞噬的方法

实际开发中,我们经常会遇到这样的情况.我们有一个层layer1,这个层包含一个menu层,menu1层里又包含了一个节点按钮button1.现在需要实现一个效果:点击button1弹出一个对话框,这个对话框里也包含一个menu2和一个按钮button2,点击button2能够关闭这个对话框.这个情况很普遍,在游戏ui中我们有大量的二级弹窗都需要用到这种效果(在这里我们不考虑直接在layer2里removefromparent,这样就不能达成学习目的了).我们可以用三种方法实现这个效果,分别是:

利用MATLAB生成模式类

最近开始了模式识别的学习,在此之前需要对模式和模式类的概念有一个了解,这里使用MATLAB实现一些模式类的生成.在此之前,引用百科上对于模式识别和模式类的定义,也算加深以下了解: 模式识别(Pattern Recognition):人类在日常生活的每个环节,从事着模式识别的活动.可以说每个有正常思维的人,在他没有入睡时都在进行模式识别的活动.坐公共汽车找汽车站,骑车判别可行进道路,对观察到的现象作出判断,对听到的声音作出反应,判断东西的好与坏以及水果的成熟与否等等都是人们判断是非,判别事物的过程

VC中利用多线程技术实现线程之间的通信

文章来源:[url]http://www.programfan.com/article/showarticle.asp?id=2951[/url] 当前流行的Windows操作系统能同时运行几个程序(独立运行的程序又称之为进程),对于同一个程序,它又可以分成若干个独立的执行流,我们称之为线程,线程提供了多任务处理的能力.用进程和线程的观点来研究软件是当今普遍采用的方法,进程和线程的概念的出现,对提高软件的并行性有着重要的意义.现在的大型应用软件无一不是多线程多任务处理,单线程的软件是不可想象的.

oc学习之封装与类之间的关系

1. 面向对象的特征-封装? 封装: 现实生活中的封装: 将很多的小东西 塞在1个大口袋里面. 好处: a. 对外部屏蔽. b. 方便管理. 代码的封装: 函数/方法 就是1种封装的体现: 将一段代码塞在函数/方法中. 好处: 屏蔽了内部的实现. 便于管理. 类是一种更高级别的封装: 1个类中封装数据的状态和行为. 将数据的状态和行为封装在了1个类中. 类中有很多复杂的实现. 对于外部而言无需关心. 只需要知道这个类是干啥的? 怎么用? 把哪些复杂的东西. 方法,属性.封装成1个类的整体. 2.

类之间的关系——宅客

类之间的关系有: 关联关系:类B作为属性被类A使用 ——对象和对象之间的连接.在java中,关联关系的代码表现形式为一个类做为另一个类的属性类型存在. ——即"有"的关系:"has-a". *关联关系分为单向关联和双向关联 ——单向关联:A类关联B类. ——双向关联:A类关联B类,B类关联A类. 例如: public class Phone{ private Person per; } public class Person{ private Phone phone

如何避免类之间的循环依赖

最近在看<Java应用架构设计 模块化模式与OSGi>,深有感触,在此做些总结.(电子版可以在Java1234.com上下载到) 在使用Java开发中,各种依赖不可避免.比如类之间的继承,jar包之间的相互依赖.依赖在某种程度上不可避免,但是过多的依赖势必会增加系统的复杂性,使代码难以阅读,从而成为团队开发的阻碍.循环依赖尤其糟糕. 循环依赖存在与多种实体之间,尤其是类.包.模块之间.当两个类相互引用时,就会出现循环依赖.下面摘抄书中的一个例子. 如图1.1所示,有Customer和Bill两