OC学习第七天_2 类的拓展 Category Extension Protocol delegate

⼆、类的扩展
Category
Category也叫分类或类⺫
主要作⽤是为 没有源代码 的类添加⽅法。
通过Category添加的⽅法会成为原类的⼀部分。从⽽达到扩展⼀
个类的功能。
如何定义 Category
新建⽂件
选择Objective-C Category模板
填写类名和分类名
.h⽂件添加⽅法声明
.m添加⽅法实现
Category的声明
NSString+SayHi.h⽂件
@interface NSString (SayHi)
- (void)hi;
@end
Category的实现
NSString+SayHi.m⽂件

import “NSString+SayHi.h”

@implementation NSString(SayHi)
- (void)hi{
NSLog(@”这是通过category为NSString添加的hi⽅法”);
}
@end
Category与⼦类的区别

练习3
使⽤Category为NSDate类添加⼀个类⽅法
(dateWithDateString:),实现将下述字符串转换为NSDate对象。
将@“20140402142850”转换为NSDate。

//  声明文件  NSDate+dateWithDateString.h
#import <Foundation/Foundation.h>
@interface NSDate (dateWithDateString)
    + (NSDate *)dateWithDateString:(NSString *)str;
@end

//  实现文件  NSDate+dateWithDateString.m
#import "NSDate+dateWithDateString.h"
@implementation NSDate (dateWithDateString)
+ (NSDate *)dateWithDateString:(NSString *)str
{
    NSDateFormatter *formatter = [[NSDateFormatter alloc]init];
    [formatter setDateFormat:@"yyyyMMddHHmmss"];
    NSTimeZone *zone = [NSTimeZone timeZoneForSecondsFromGMT:0];
    [formatter setTimeZone:zone];
    NSDate *date = [formatter dateFromString:str];
    return date;
}
@end
//  main.m
首先导入头文件
//调用语句(main内部):
NSString *str = @"20140402142850";
NSLog(@"%@",[NSDate dateWithDateString:str]);

Extension
Extension的主要作⽤是管理类的“私有”⽅法。
⾯向对象编程也叫⾯向接⼝编程。
在设计⼀个类的时候,有些⽅法需要对外公开(我们称为接⼝),
有些⽅法仅仅内部使⽤(⽐如:是某个⽅法的⼀个⼩步骤)。
Extension的功能是帮我们去管理这些内部使⽤的⽅法(“私有”⽅
法)。
定义Extension
Extension的语法格式和Category很相似
相当于把Category的.h⽂件挪到了原始类的.m⽂件中
Extension针对的是⾃⼰的类,必须有源代码的类
定义Extension

xxx.m⽂件
@interface xxx (ExtensionName)
//你的⽅法列表
@end
@implementation xxx
//⽅法的实现
@end

Category和Extension的区别

Protocol
Protocol(协议),是iOS开发中常⽤的技术。
协议是⼀套标准(⼀堆⽅法的声明),只有.h⽂件。就像⼀张任
务清单(或便利贴),上⾯写了⼀堆需要处理的事。清单交给谁,
谁就要去完成清单上规定的任务。
接受协议的对象实现协议中定义的⽅法。即:清单交给谁,谁就
要去完成清单上规定的任务。
如何定义Protocol
@protocol开始,以@end结束,例如:
@protocol MarryProtocol
- (void)makeMoney;
@optional
- (void)washcloth;
- (void)cook;
@end
如何定义Protocol
@protocol开始,以@end结束,例如:
@protocol MarryProtocol
- (void)makeMoney;
@optional
- (void)washcloth;
- (void)cook;
@end
协议中的⽅法默认是必须实现的,即@required。
关键字 @optional 修饰的⽅法是可选的,可实现
也可不实现。
遵守协议
遵守协议分两步
1、在类的.h⽂件 ⽗类名后写上<协议名>。
2、在.m⽂件中实现协议中的⽅法。
相当于给这个类添加了若干个⽅法。这个类的实例就可以调⽤这
些⽅法。
如何遵守协议

import “MarryProtocol”

@interface Boy : NSObject

@end
@implementation Boy
//协议中⽅法的实现
@end
delegate设计模式
Protocol的核⼼使⽤场景是实现delegate设计模式。
delegate(代理)。通俗的讲就是代理商,主要的任务是帮你完
成⼀些任务。
⽐如:保姆就可以认为是delegate,主要的任务是帮你带孩⼦、
做饭、洗⾐服等。
delegate设计模式
delegate设计模式
使⽤场景:凡是某些任务⾃⼰不去实现,想让别⼈去实现的时候,
就可以指定⼀个代理,让代理帮你去做。你只需要通知代理去做某
某事。
delegate设计模式
delegate的应⽤
课堂练习:结婚。
总结
NSDate是iOS中表⽰⽇期的类。可以使⽤NSDateFormatter控制
NSString和NSDate的互转
Category能为没有源代码的类添加⽅法
Extension为类管理私有⽅法
Protocol和delegate通常联合使⽤,是iOS开发中特别常⽤。

// 这里是结婚练习
// Boy类
// Boy.h
#import <Foundation/Foundation.h>
#import "MarryProtocol.h"  //  导入协议头文件
//  使用协议代理的步骤
//  1.创建协议
//  2.遵守协议
//  3.实现协议中的方法(谁遵守谁实现)
//  4.添加代理对象为实例变量(谁需要代理 就在那个类里声明实例变量,而且还必须是遵守协议的实例变量)
//  5.添加设置代理对象的方法(set方法)
//  6.让代理去干活(让代理去调用协议中的方法)
//  7.从main创建对象 设置代理对象
@interface Boy : NSObject <MarryProtocol> //  遵守协议
{

}
- (void)sing;
@end

// Boy.m
#import "Boy.h"
@implementation Boy
- (void)makeMoney
{
    NSLog(@"挣钱给老婆花");
}
- (void)washClothes
{
    NSLog(@"给老婆洗衣服");
}
- (void)cook
{
    NSLog(@"给老婆做饭吃");
}
- (void)sing
{
    NSLog(@"唱歌去喽");
}
@end

// Girl类
// Girl.h
#import <Foundation/Foundation.h>
#import "MarryProtocol.h"

@interface Girl : NSObject
{
    //  代理对象作为实例对象
    //  代理的对象必须遵守协议的对象
    id<MarryProtocol> _delegate;
}
//  添加设置代理的方法
- (void)setDelegate:(id<MarryProtocol>)delegate;
- (void)shopping;
- (void)hungry;
- (void)dirty;
@end
// Girl.m
#import "Girl.h"
@implementation Girl
//  添加设置代理的方法
- (void)setDelegate:(id<MarryProtocol>)delegate
{
    _delegate = delegate;
}
- (void)shopping
{
    NSLog(@"找老公要钱购物");
}
- (void)hungry
{
    NSLog(@"叫老公做饭给我吃");
    //  需要 你给他做饭
    //  需要 代理去做饭
    //  需要 代理去调用做饭方法
    //  需要 代理的对象去调用协议中的方法(因为代理对象实现代理的方法)

    //  让代理去调用协议中的方法
    //  判断代理有没有实现这个方法
    //  respondsToSelector方法 判断这个类中有没有实现某个方法 返回一个布尔值
    //  让代理去调用方法的一个安全保护
    if ([_delegate respondsToSelector:@selector(cook)]) {
        [_delegate cook];
    }
}
- (void)dirty
{
    NSLog(@"让老公给我洗衣服");
}
@end
// MarryProtocol.h //结婚协议只有一个.h文件
#import <Foundation/Foundation.h>
@protocol MarryProtocol <NSObject>
//  如何遵守协议
//  用尖括号<要遵守的协议>
//  协议中 声明协议的方法
//  如果没有明确的要求 默认协议中的方法是都要实现的

//  挣钱
@required //  必须要实现的(也是默认的)
- (void)makeMoney;
//  做饭
@optional //  可选择实现的
- (void)cook;
//  洗衣服
- (void)washClothes;

// main.m
#import <Foundation/Foundation.h>
#import "Boy.h"
#import "Girl.h"

int main(int argc, const char * argv[]) {

    Boy *b = [[Boy alloc]init];
    [b sing];
    Girl *g = [[Girl alloc]init];
    [g shopping];
    //  设置代理
    [g setDelegate:b];
    [g hungry];   
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值