iOS中避免类的循环引用和协议一起使用

本文通过朱元璋与常遇春的故事,阐述了在项目中两个类(如领导与员工)如何通过协议实现相互依赖与交互。详细介绍了如何在Objective-C中定义协议、类,并实现协议方法,以实现角色间的互动。通过实例代码,展示了如何在类间传递信息和执行特定任务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在项目中,比如两个类同时互有对方的元素。例如生活中的领导和员工一样。

 领导下面要有员工的姓名

  员工要知道领导的姓名。那这个时候姓名的属性在两个类中都要互有的。

  下面的事解决办法了。以皇帝朱元璋和员工常遇春为例。并着协议一块来了,上代码。。。

  首先作为老板要给下面的员工规定协议了,来我公司上班的话。所以协议内容如下

  1 :新建一个协议  EveryDayWork.h

  

@protocol EveryDayWork <NSObject>


@required
/**
 *  打扫卫生
 */
- (void)doClear:(NSString *)boser pers:(NSString *)personer;

/**
 * 打卡
 */
- (void)doCard:(NSString *)boser pers:(NSString *)personer;




@optional
/**
 *  吃饭
 */
- (void)doEat;


/**
 *  发工资
 */
- (void)sendMoney;

@end

  老板要求员工每天打扫卫生,打卡。最可恨的是发工资还时随机的,多少步固定

  下面老板来了创建一个老板类Boos和一个员工类Person

  以上分析说两个类中要互相拥有各自的姓名。并且老板拥有最终的解释权。所有要有自己的协议。所以在创建老板      类的时候请看:

  Boos.h

  2 :在创建的时候,首先把协议的头文件引入,然后用@class person 把拥有的类写入,一定记得在.h文件中用@class   

#import "EveryDayWork.h"
//老板引用员工
@class Person;

@interface Boos : NSObject

{
    @public
    NSString *_name;
    /**
     *  要有尊谁协议的员工
     */
    id<EveryDayWork> _worker;
    
    /**
     *  员工
     */
    Person *pers;
}

- (id)initWithName:(NSString *)names;


- (void) BDoClear:(NSString *)boser pers:(NSString *)personer;

- (void) BDoCard:(NSString *)boser pers:(NSString *)personer;

@end

    看一下Boos.m

   应为老板有员工 于是让遵守协议的员工来每天按照他的协议来办事。在。m中 用import引入员工的。h文件

<pre name="code" class="objc">#import "Boos.h"
#import "Person.h"

@implementation Boos

- (id)initWithName:(NSString *)names
{
    self = [super init];
    _name = names;
    
    return self;
}

- (void) BDoClear:(NSString *)boser pers:(NSString *)personer
{
    [_worker doClear:boser pers:personer];
}

- (void) BDoCard:(NSString *)boser pers:(NSString *)personer
{
    [_worker doCard:boser pers:personer];
}

@end


  3:看person类文件的代码

  .h文件如下,作为员工就要无条件的遵守协议了,所以要引入协议的头文件,也要知道给那个领导干活,用@calss引入老板类了,在该类继承类的后面用<>写入协议的名称

#import <Foundation/Foundation.h>
#import "EveryDayWork.h"
@class Boos;

@interface Person : NSObject <EveryDayWork>

{
    @public
    NSString *_Pnames;
    
    /**
     *  傻逼老板
     */
    Boos *bos;
    
}

- (id)initWithName:(NSString *)names;

@end

  做为员工就要实现老板定的协议,所以就要在。m文件中实现了。应为person类遵守了协议,所以要看协议中哪些事必须实现的

  

#import "Person.h"
#import "Boos.h"


@implementation Person



- (id)initWithName:(NSString *)names
{
    self = [super init];
    
    _Pnames = names;
    
    return  self;
}

/**
 *  打扫卫生
 */
- (void)doClear:(NSString *)boser pers:(NSString *)personer
{
    NSLog(@"员工[%@]打扫了皇帝[%@]的办公室",personer,boser);
}

/**
 * 打卡
 */
- (void)doCard:(NSString *)boser pers:(NSString *)personer
{
    
 NSLog(@"皇帝[%@]让员工[%@]镇守云南",boser,personer);
}

@end

  4:在main 函数中实现

     4.1:首先引入两个类文件

       #import "Boos.h"

      #import "Person.h"

    4.2 在main函数里 加载老板和员工

 /**
     *  加载老板
     */
    Boos *bos = [[Boos alloc] initWithName:@"朱元璋"];

    
    
    /**
     *  person
     */
    Person *per = [[Person alloc] initWithName:@"常遇春"];

  //在指定老板下面的员工

   

bos->_worker = per;


//老板开始用员工办里日常上班的事情了

  

[bos BDoClear:bos->_name pers:per->_Pnames];
    [bos BDoCard:bos->_name pers:per->_Pnames];


下面事员工办理的事情

  

Boos *temp = per->bos = bos;
    //NSLog(@"皇帝:%@",temp->_name);
    Person *temPer = bos->pers = per;
    //NSLog(@"员工:%@",temPer->_Pnames);
    
    [per doClear:temp->_name pers:temPer->_Pnames];
    [per doCard:temp->_name pers:temPer->_Pnames];

总结:在两个或两个类以上的文件中互相拥有各自的其中的某个属性时,我们就要用循环引用。

  循环应用的正确的方法是

       如果两个类的循环引用,在两个类的。h文件中只写@calss类名

     然后在。m文件中将类名对应实际文件导入

  • 欢迎各位一块学习,提高逼格!
  • 也可以添加洲洲哥的微信公众号

    更多消息

    更多信iOS开发信息 请以关注洲洲哥 的微信公众号,不定期有干货推送:

     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值