一.类目也称为分类
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];//给S
tudent的stu对象开辟空间并赋初值
Waiter *wa=[[Waiter alloc]init];//非Waiter的wa对象开辟空间并赋初值
stu.delegate=wa;//因为要用stu对象的代理去执行学生对服务员协议的方法
[stu serve];
}
return 0;
}
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{//类目方法的实现
}
@end
main函数
#import
#import "NSString+CSayHi.h"
int main(int argc, const char * argv[])
{
}
二延展
1.延展是一种特殊形式的类目
2.延展中定义的方法在类本身中实现
作用
定义私有方法
注意
延展不写类目名时,表示严重中定义的方法必须实现
如果提供了类目名称,则可以选择性实现
下面来看具体代码
类的.m文件
#import "Student.h"
//延展写在.m文件上
//延展不提供名称表示方法必须实现,提供名称可以不实现
//延展是定义私有方法
@interface Student(sayHi)
-(void)sayHi;//延展的声明
@end
@implementation Student
@synthesize name;
-(void)sayHi{//延展的实现
}
-(void)say{
}
@end
main函数
三
协议就是一套标准
协议只声明了方法,不具体实现,接受协议的对象负责实现
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{
}
//制定一个服务员的类,需要服务员去遵守学生定的协议
服务员的.h
#import <Foundation/Foundation.h>
#import "Student.h"
@interface Waiter : NSObject <roomServer>//把学生的协议引进
@end
服务员的.m文件
学生定的协议要由服务员来施行
#import "Waiter.h"
@implementation Waiter
-(void)check
{
}
-(void)tackClothes
{
}
@end
main文件
#import <Foundation/Foundation.h>
#import "Student.h"
#import "Waiter.h"
int main(int argc, const char * argv[])
{
}