Category 可以在不改变原来类代码的基础上,扩展类的方法
main.m——文件
protocol 协议
以按钮监听器为例:
Buttom.h
Button.m
// 使用协议的类。
ButtonListener.h
// 另一个实现监听器协议的类
MyListener.h
MyListener.m
main.c
block
实际应用:Button监听器
例:
Button.h
Button.m
main.m
// block可以访问,外部不变量,但不可以修改外部变量
int c=10;
//如果外部变量用了__block关键字,则可以修改
__block int d=10;
.h
#import "Student.h"
// ()代表着是一个分类
// ()中的Tests是分类的名称
@interface Student (Test)
// 分类只能扩展方法,不能增加成员变量
-(void)test;
@end
@implementation Student (Test)
// 分类方法的实现
-(void)test{
NSLog(@"test方法");
}
@end
main.m——文件
#import <stdio.h>
#import "Student.h"
#import "Student+test.h"
int main(int argc, const char * argv[])
{
Student *stu=[[Student alloc]init];
[stu test]; //直接使用分类定义的方法
return 0;
}
protocol 协议
以按钮监听器为例:
Buttom.h
#import <Foundation/Foundation.h>
@class Button;
// 协议的声明可以写在需要使用的类声明中,也可以单独写一个文件。
// 一般如果只给一个类使用,就写在类声明中,如果多个文件使用,就单独写一个文件
// <>代表实现某个协议
@protocol ButtonDelegate<NSObject>
-(void) onClick:(Button *)but;
@end
@interface Button:NSObject
// delegate 按钮的监听器
@property (nonatomic,retain) id<ButtonDelegate> delegate;
// 点击按钮
-(void)click;
@end
Button.m
#import "Button.h"
@implementation Buttom
-(void) dealloc{
[_delegate release];
[super dealloc];
}
@end
// 使用协议的类。
ButtonListener.h
#import <Foundation/Foundation.h>
// 对协议进行提前声明,跟@class的用途是一致的
@protocol ButtonDelegate;
@interface ButtonListener : NSObject<ButtonDelegate>
-(void)onClick:(Button *)but;
@end
// 实现协议类中定义的方法
ButtonListener.m
#import "ButtonListener.h"
@implementation ButtonListener
-(void)onClick:(Button *)but{
NSLog(@"按钮%@被点击了",but);
}
@end
// 另一个实现监听器协议的类
MyListener.h
#import <Foundation/Foundation.h>
#import "Button.h"
@interface MyListener : NSObject<ButtonDelegate>
-(void)onClick:(Button *)but;
@end
MyListener.m
#import "MyListener.h"
@implementation MyListener
-(void)onClick:(Button *)but{
NSLog(@"这是MyListener的监听器");
}
@end
main.c
#import <Foundation/Foundation.h>
#import "Button.h"
#import "ButtonListener.h"
#import "MyListener.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
// 初始化一个按钮
Button *but=[[Button alloc] init];
// 初始化一个按钮监听器,并复制给but
but.delegate=[[ButtonListener alloc] init];
// 模拟点击按钮
[but click];
// 换一个按钮监听器
but.delegate=[[MyListener alloc] init];
// 模拟点击按钮
[but click];
}
return 0;
}
block
// 定义了一个blcok ,这个block返回int类型,接受两个int类型的参数
int (^Sum)(int,int)=^(int a,int b){
return a + b;
};
int a = Sum(10,10);
NSLog(@"%i",a);
// 结合typedef 使用
typedef int(^MySum) (int,int);
// 声明了一个blck变量
MySum sum=^(int a,int b){
return a + b;
};
实际应用:Button监听器
例:
Button.h
#import <Foundation/Foundation.h>
@class Button;
// typedef int(^MySum) (int,int);
typedef void (^ButtonBlock) (Button *but);
@interface Button : NSObject
// block不需要* ,设置一个变量接收block代码段
@property (nonatomic,assign) ButtonBlock block;
-(void)click;
@end
Button.m
#import "Button.h"
@implementation Button
-(void)click{
_block(self);
}
@end
main.m
#import <Foundation/Foundation.h>
#import "Button.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
Button *but=[[Button alloc] init];
// 把自己的block 传入but的block
but.block=^(Button *but){
NSLog(@"这个%@按钮被点击了。",but);
};
// 模拟按钮点击
//
[but click];
}
return 0;
}
// block可以访问,外部不变量,但不可以修改外部变量
int c=10;
//如果外部变量用了__block关键字,则可以修改
__block int d=10;