IOS类目、延展、代理协议

一.类目也称为分类
1.可以为已知的类添加方法,哪怕是你没有源码的类
2.通过类目添加方法会称为原始类的一部分
3.与原类中的方法同级
4.而且会被子类继承

类目的用处
1.可以扩展别人的类,可以座位子类的替代方式。
2.把同一个类的代码放到多个文件中,便于多人协作
 
注意
1.不能在类目中添加 实例变量
2.可以为同一类添加多个类目,蛋类目名和方法名不能城府
3.不能随意重写类的方法

下面我么来看具体的代码

类目.h文件
#import
//类目  在类目中不能添加实例变量
@interface NSString (CSayHi)
-(void)sayHi;//类目的方法

@end

类目.m文件
#import "NSString+CSayHi.h"

@implementation NSString (CSayHi)
-(void)sayHi{//类目方法的实现
    NSLog(@"这是类目提供的方法,字符内容是%@",self);
}
@end


main函数
#import
#import "NSString+CSayHi.h"
int main(int argc, const char * argv[])
{

    @autoreleasepool {
        NSString *str=@"hello";//定义一个字符串对象并赋值
        [str sayHi];//调用类目方法
       
       
       
    }
    return 0;
}
二延展
1.延展是一种特殊形式的类目
2.延展中定义的方法在类本身中实现

作用
定义私有方法

注意

延展不写类目名时,表示严重中定义的方法必须实现
如果提供了类目名称,则可以选择性实现

下面来看具体代码
类的.m文件
#import "Student.h"
//延展写在.m文件上
//延展不提供名称表示方法必须实现,提供名称可以不实现
//延展是定义私有方法
@interface Student(sayHi)
-(void)sayHi;//延展的声明
@end

@implementation Student
@synthesize name;
-(void)sayHi{//延展的实现
    NSLog(@"%@打招呼",self.name);
}
-(void)say{
    [self sayHi];
}
@end

main函数
        Student *stu=[[Student alloc]init];
        stu.name=@"小白";
       
        [stu say];//调用方法
三  协议
协议就是一套标准
协议只声明了方法,不具体实现,接受协议的对象负责实现
oc的协议由@protocol声明的一组方法列表
要求其他的类去实现,相当@interface部分的声明
@protocol   协议名称
@end

确认协议
定义的协议必须要被某些类实现
类中需要shiixan协议中定义的方法
此过程称为确认协议
@interface 类名:父亲名<协议名称,协议名二.....>
@end
注意
确认协议时应实现协议中@required修饰的方法
可以选择性实现@opyional
使用[对象 conformsToProtocol:@protocol(SalerProtocol)]判断是否遵循协议
代理模式
即本身不做实际的事情,而要求其他人去做
@property(assign,nonatomic)id<协议名>delegate

看实际代码 我们要求一个学生对服务员制定一个协议

学生类的.h文件

//首先我们创建一个学生的类
#import <Foundation/Foundation.h>

//学生的协议内容的声明
@protocol roomServer <NSObject>

@required//必须要实现的
-(void)check;//结账声明
@optional//不是必须要实现的
-(void)tackClothes;//拿衣服
@end

@interface Student : NSObject
@property(assign,nonatomic)id<roomServer> delegate;//声明属性代理()该属性遵守roomServer协议//
-(void)serve;//声明方法
@end

学生类的.m文件
#import "Student.h"

@implementation Student
@synthesize delegate;
-(void)serve{
    //使用if委托给的对象是否遵守了协议
    if ([self.delegate conformsToProtocol:@protocol(roomServer)]) {
        [self.delegate check];//服务员类的一个(代理)对象调用代理方法
        [self.delegate tackClothes];
    }
}
//制定一个服务员的类,需要服务员去遵守学生定的协议
服务员的.h
#import <Foundation/Foundation.h>
#import "Student.h"
@interface Waiter : NSObject <roomServer>//把学生的协议引进

@end
服务员的.m文件
学生定的协议要由服务员来施行
#import "Waiter.h"

@implementation Waiter
-(void)check
{
    NSLog(@"我给您结账");
}
-(void)tackClothes
{
    NSLog(@"我给您拿衣服");
}
@end


main文件
#import <Foundation/Foundation.h>
#import "Student.h"
#import "Waiter.h"
int main(int argc, const char * argv[])
{

    @autoreleasepool {
       
        Student *stu=[[Student alloc]init];//给Student的stu对象开辟空间并赋初值       
        Waiter *wa=[[Waiter alloc]init];//非Waiter的wa对象开辟空间并赋初值
        stu.delegate=wa;//因为要用stu对象的代理去执行学生对服务员协议的方法
        [stu serve];
    }
    return 0;
}
参考文章:http://www.cnblogs.com/sgdkg/p/3142647.html 
http://blog.sina.com.cn/s/blog_b6e3f37101019evl.html
http://www.cnblogs.com/jy578154186/archive/2013/02/27/2934789.html

你可能感兴趣的:(扩展,delegate,协议,类目,延展)