block 的概念和使用
block是一种数据类型, 可以使用这种数据类型定义变量, 并赋值。
block数据类型在使用前需要先定义该数据类型, 然后再使用(就像使用Person类一样, 先定义一个Person类, 然后再通过Person类声明一个Person类型变量)。
block这种数据类型用来保存一个方法、函数、一段代码
int (^block)(int,int) = ^(int n, int m){};
int (^block)(int,int) = ^(int n, int m){};
基本格式:
void (^block名)() = ^{代码块; };
使用格式:
block名();
特点:类型比函数定义多了一个^
设置数值,有一个^,内容是{}括起的一段代码
- void (^myBlock)() = ^{
- NSLog(@"hello");
- }
- myblock();//执行时
-
block带有参数的block定义和使用
格式:void (^block名称)(参数列表)
=^(参数列表){//代码实现}
- 定义有参数的block
- void (^sumBlock)(int ,int) = ^(int x,int y){
- NSLog(@"%d",x+y);
- }
带有参数和返回值的block
格式:返回类型(^block名称)(参数列表)
=^返回类型(参数列表){//代码实现}
- 定义有返回值和参数的block
- int (^sumBlock2)(int ,int) = ^(int x,int y){
- return x+y;
- }
- //调用返回值的block
- NSLog(@"%d",sumBlock2(4,3));
block 的typedef
函数指针的使用:
函数指针变量定义的一般形式:
类型说明符(*指针变量名)();
定义函数指针:技巧:
1、把函数的声明拷贝过来
2、把函数名换成(*函数指针变量名)
3、形参名可写可不写
函数指针别名:
typedef int (*newtype)(int x,inty);
newtype f1,f2,f3;//f1实际上类型int(*f1)(int x,int y)
格式:tyepdef 返回值(^block变量名)(参数类型列表);
block访问外部变量
在block内部可以访问block外部的变量
但不可修改block外部的变量
- int m = 10;
- NSLog(@"1:m = %d",m); //10
- NSLog(@"2:m addr = %p",&m); //栈区
- void (^myBlock)()=^{
- m = 100; // 错误,m的值不能被修改
- NSLog(@"5:m addr = %p",&m); //堆区
- };
- NSLog(@"4:m addr = %p",&m); //栈区
- //使用
- myBlock();
给局部变量加上_block关键字,则这个局部变量可以再block内部进行修改
- //block外部定义的变量_
- block int m = 10;
- //定义block
- void (^myBlock)() = ^{
- m = 100;
- NSLog(@"m = %d",m);
- }
- //使用block
- myBlock();/m = 100;
-
当外部变量前面加上__block 时,此时不再以const方式复制,此时可以修改变量的值。
定义的全局变量,在block内部可以修改其值;
block作为函数的返回值
步骤:
- //1、使用typedef定义一个新的类型
- typedef int(^newType)(int num1, int num2);
- //2、使用新的类型作为函数的返回值
- newType test(){
- newType work = ^(int x, int y){
- return x+y;
- };
- return work;
- }
- //3、定义变量接收函数的返回值(block类型)
- //4、调用block
- newType work2 = test();
-
- NSLog(@"work2 = %d",work2(3,6));
protocol概念和基本使用
protocol就是协议。
使用流程:定义协议->在类中采用指定的协议->实现协议中的方法
定义协议:
@protocol 协议名称<NSObject>默认遵守NSObject
//方法声明列表
@end
采纳协议:
类遵守协议
- @interface Person:NSObject <协议1,协议2>
-
protocol
- //定义协议
- Run.h
- #import <Foundation/Foundation.h>
- @protocol Run <NSObject>
- -(void)eat;
- @end
- Work.h
- #import <Foundation/Foundation.h>
- @protocol Work:<NSObject>
- -(void)myWork;
- @end
- //采纳协议
- Person.h
- #import <Foundation/Foundation.h>
- #import "Run.h"
- #import "Work.h"
- @interface Work:NSObject<Run,Work>
- @end
- Person.m
- @implementation Person
- -(void)eat{
- NSLog(@"eat!!!");
- }
- -(void)myWork{
- NSLog(@"mywork is studyios");
- }
- @end
1、Protocol:就死用来声明方法,不能声明成员变量不能实现
2、只要某个类遵守这个协议,就拥有了这个协议中的方法声明
3、只要父类遵守了某个协议,那么子类也需要遵守
4、Protocol声明的方法可以让任何类去实现,Protocol就是协议
5、OC中不能继承多个类,但可以遵守多个协议
6、NSObject是基协议,是最根本的协议
7、协议可以遵守协议,一个协议遵守另一个协议就拥有了另一根协议中的声明
Protocol中的@required和@optional
@required这个方法必须要实现
@optional 这个方法不一定要实现