在项目中,比如两个类同时互有对方的元素。例如生活中的领导和员工一样。
领导下面要有员工的姓名
员工要知道领导的姓名。那这个时候姓名的属性在两个类中都要互有的。
下面的事解决办法了。以皇帝朱元璋和员工常遇春为例。并着协议一块来了,上代码。。。
首先作为老板要给下面的员工规定协议了,来我公司上班的话。所以协议内容如下
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开发信息 请以关注洲洲哥 的微信公众号,不定期有干货推送: