在代码的头文件中,假如有如下这么多的成员变量,也就需要相应的 setter, 和 getter 方法
#import <Foundation/Foundation.h>
@interface Things : NSObject
{
NSUInteger thing1;
NSUInteger thing2;
NSUInteger thing3;
NSUInteger thing4;
NSUInteger thing5;
}
- (void)resetAllValue;
- (void)print;
- (void)setThing1:(NSUInteger)thing1;
- (NSUInteger)thing1;
- (void)setThing2:(NSUInteger)thing2;
- (NSUInteger)thing2;
- (void)setThing3:(NSUInteger)thing3;
- (NSUInteger)thing3;
- (void)setThing4:(NSUInteger)thing4;
- (NSUInteger)thing4;
- (void)setThing5:(NSUInteger)thing5;
- (NSUInteger)thing5;
@end
这样相应的. m 文件就会繁琐到不行,这才是5个变量,假如是100个,需要许多人来完成,总不能让每个人都拿着核心文件吧,于是把它们分散开非常有必要,而类别给我们提供了一种这样的机制,只需要一个总的实现文件 .m,然后把其中部分方法分散到其类别文件中去实现.如下, 头文件Things.h文件要修改代码如下:
@interface Things : NSObject
{
NSUInteger thing1;
NSUInteger thing2;
NSUInteger thing3;
NSUInteger thing4;
NSUInteger thing5;
}
- (void)resetAllValue;
- (void)print;
//类的扩展如下
@interface Things (thing1)
- (void)setThing1:(NSUInteger)thing1;
- (NSUInteger)thing1;
@end
@interface Things (thing2)
- (void)setThing2:(NSUInteger)thing2;
- (NSUInteger)thing2;
@end
@interface Things (thing3)
- (void)setThing3:(NSUInteger)thing3;
- (NSUInteger)thing3;
@end
@interface Things (thing4)
- (void)setThing4:(NSUInteger)thing4;
- (NSUInteger)thing4;
@end
@interface Things (thing5)
- (void)setThing5:(NSUInteger)thing5;
- (NSUInteger)thing5;
@end
实现文件 Things.m 的内容只需要核心的方法,其余让其扩展类别去做:
#import "Things.h"
@implementation Things
- (void)print
{
NSLog(@"%ld,%ld,%ld,%ld,%ld",self.thing1,self.thing2,self.thing3,self.thing4,self.thing5);
}
- (void)resetAllValue
{
self.thing1 = 100;
self.thing2 = 200;
}
@end
其余具体实现,即需要好多人做的部分,给他们分开,下面举一个 Things+Thing1.m 文件
#import "Things.h"
@implementation Things (Thing1)
- (void)setThing1:(NSUInteger)t
{
thing1 = t;
}
- (NSUInteger)thing1
{
return thing1;
}
@end
@selector(setEngine:)
@selector(setTire:atIndex)
QYCar *car = [[Car alloc] init];
if([car respondsToSelector:@selector(setEngine:)]){
NSLog(@"hihi");
}
下面,我就用一个简单的例子来实现非正式协议实现委托
第一步,创建名 QYXiaoMing的类继承自NSObject 类,在创建一个 QYXiaoHong 的类,来实现一个这样的功能:
小明学习累了,想让小红在他睡着后某段时间后再把他叫起来,这时候小红叫小明这个动作就是一个委托 .具体代码如下:
QYXiaoMing.h 的内容
#import <Foundation/Foundation.h>
@interface QYXiaoMing : NSObject
//小明学习累了,有学习的行为
- (void)startSleep:(NSUInteger) time;
@end//QYXiaoMing.h
QYXiaoMing.m 的内容
#import "QYXiaoMing.h"
#import "QYXiaoHong.h"
@implementation QYXiaoMing
- (void)startSleep:(NSUInteger)time
{
NSLog(@"Sleep...");
QYXiaoHong *xiaohong = [[QYXiaoHong alloc] init];
[xiaohong call:time];
}
@end//QYXiaoMing.m
头文件QYXiaoHong.h
#import <Foundation/Foundation.h>
@interface QYXiaoHong : NSObject
- (void)call:(NSUInteger)time;
@end//QYXiaoHong.h
具体实现QYXiaoHong.m
#import "QYXiaoHong.h"
@implementation QYXiaoHong
- (void)call:(NSUInteger)time
{
//需要在指定的时间里把小明叫起来(计时器的用法)
[NSTimer scheduledTimerWithTimeInterval:time target:self selector:@selector(callXiaoMing) userInfo:nil repeats:NO];
}
@end //QYXiaoHong.m
类别头文件NSObject+CallXiaoMing.h
#import <Foundation/Foundation.h>
@interface NSObject (CallXiaoMing)
- (void)callXiaoMing;
@end
类别实现文件NSObject+CallXiaoMing.m
#import "NSObject+CallXiaoMing.h"
@implementation NSObject (CallXiaoMing)
- (void)callXiaoMing
{
NSLog(@"lalala,don‘t sleep!");
}
@end
main.m 的代码
#import <Foundation/Foundation.h>
#import "QYXiaoMing.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
QYXiaoMing *xiaoming = [[QYXiaoMing alloc] init];
[xiaoming startSleep:5];//5是5秒
//要求程序运行到这里,不能结束, 是为了让显示的时间循环显示下
[[NSRunLoop currentRunLoop] run];
}
return 0;
}//main.m
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/www_nyp_boke/article/details/46711841