OC学习之--类的扩展

一.Category

    1.简介

        Category也叫分类或者类目

        主要作用是为没有源代码的类添加方法

        通过Category添加的方法会成为原类的一部分.从而达到扩展一个类的功能.    

    2.定义

        新建文件

        选择Objective-C Category模板

        填写类名和分类名

        .h文件添加方法声明

        .m添加方法实现

    3.声明

    NSString+Info.h

#import <Foundation/Foundation.h>

@interface NSString (Info)
- (void)info;
@end

    4.实现

    NSString+Info.m

#import "NSString+Info.h"

@implementation NSString (Info)
- (void)info
{
    NSLog(@"王宁");
}
@end

    5.main.m

NSString *str = [[NSString alloc] init];
[str info];

    

    6.Category与子类的区别


Category Subclass
功能 只能为类添加方法 既能添加方法又能添加变量
特点 新添加的方法会成为原始类的一部分,能被子类继承 新添加的方法只有子类有,父类不具有
使用 使用原始类的实例(如果是-方法)或者原始类(如果是+方法)调用方法 子类才能调用.如果在项目开发到尾声的时候,使用子类添加了方法,需要对已经写掉吗做类型替换(将父类替换成子类)

二.Extension

    1.简介

        Extension的主要作用是管理类的"私有"方法

        面向对象编程也叫面向接口编程

        设计类的时候有些方法对外公开,有些只对内使用. Extension的功能是帮我们去管理这些内部使用的方法

    2.定义

        以计算三个数和为例

        Cacl.h文件

#import <Foundation/Foundation.h>

@interface Cacl : NSObject
- (NSInteger)MaxOfThree:(NSInteger)num1 num2:(NSInteger)num2 num3:(NSInteger)num3;
- (NSInteger)MaxOfThree:(NSInteger)num1 num2:(NSInteger)num2;
@end

        Cacl.m

#import "Cacl.h"
//管理类的私有方法
@interface Cacl ()
@property (nonatomic, assign) NSInteger num;
- (NSInteger)MaxOfTwo:(NSInteger)num1 num2:(NSInteger)num2;
- (NSInteger)MaxOfTwo:(NSInteger)num1;
@end

@implementation Cacl
- (NSInteger)MaxOfTwo:(NSInteger)num1
{
    return self.num > num1 ? self.num : num1;
}
- (NSInteger)MaxOfThree:(NSInteger)num1 num2:(NSInteger)num2
{
    [self MaxOfTwo:num1];
    return [self MaxOfTwo:num2];
}

@end

        main.m

Cacl *cal = [[Cacl alloc] init];
NSInteger a = [cal MaxOfThree:2 num2:5 num3:1];
NSLog(@"%ld", a);

    3.Category和Extension的区别


Category Extension
作用 为没有源代码的类添加方法 管理类的私有方法
格式 定义一对.h和.m 把代码写到原始类的.m文件中

三. Protocol

    1.简介

        Protocol(协议)是一套标准, 只有.h文件.

        接受协议的对象实现协议中定义的方法.

    2.定义

    System.h

#import <Foundation/Foundation.h>

@protocol KeyboardDelegate <NSObject>
//必须实现的方法
@required
//选择实现的方法
@optional
- (void) returnKeyHandle;
@end
@interface System : NSObject

@property (nonatomic, assign) id <KeyboardDelegate> delegate;
- (void) returnTrigger;
@end

        System.m

#import "System.h"

@implementation System
- (void)returnTrigger
{
    [self.delegate returnKeyHandle];
}
@end

    3.遵守协议

        Developer.h

#import <Foundation/Foundation.h>
#import "System.h"
@interface Developer : NSObject <KeyboardDelegate>
- (void) returnKeyHandle;
@end

        Developer.m

#import "Developer.h"

@implementation Developer
//实现符合协议的方法
- (void) returnKeyHandle
{
    NSLog(@"河俊 寡廉鲜耻也");
}
@end

五.delegate设计模式

     1.简介

        protocol的核心使用场景是实现delegate设计模式

      2.mian.m

 System *sys = [[System alloc] init];
 Developer *dev = [[Developer alloc] init];
 sys.delegate  = dev;
 [sys returnTrigger];








你可能感兴趣的:(protocol,delegate,extension,category)