特有语法,分类Category,protocol协议,block

Category 可以在不改变原来类代码的基础上,扩展类的方法

.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;

你可能感兴趣的:(特有语法,分类Category,protocol协议,block)