标签:
------- iOS培训、Android培训、Java培训、期待与您交流! ----------
【block类型】
1、block概念
block对象是一个C级别的语法和运行机制,不同之处,它除了有可执行代码以外,它还包含了与堆栈内存绑定的变量
方法的回调
block是一个类型,定义变量,用来存储代码块
2、block基本用法
block与函数很相似,有返回值类型,参数类型,主体;
返回值类型 (^block变量名)(形参列表) = ^(形参列表) {
};
没有参数可以写void,比如:int (^blockname)(void);
1 1、block概念 2 block对象是一个C级别的语法和运行机制,不同之处,它除了有可执行代码以外,它还包含了与堆栈内存绑定的变量 3 方法的回调 4 5 block是一个类型,定义变量,用来存储代码块 6 7 2、block基本用法 8 block与函数很相似,有返回值类型,参数类型,主体; 9 • Block的组成要素跟函数类似 10 • 返回值 11 • 形式参数 12 • 实际参数 13 • Block的定义格式 14 返回值类型 (^block变量名)(形参列表) = ^(形参列表) { 15 16 }; 17 没有参数可以写void,比如:int (^blockname)(void); 18 19 #import <Foundation/Foundation.h> 20 21 int main(int argc, const char * argv[]) { 22 @autoreleasepool { 23 /* 24 有参有返回值 25 格式: 返回值类型 (^block变量名)(参数类型及个数)= ^(形参列表){ 26 代码块的语句; 27 return ; 28 }; 29 block变量的使用 30 block变量名(实参); 31 32 有参无返回值 33 格式: void (^block变量名)(参数类型及个数)= ^(形参列表){ 34 代码块的语句; 35 }; 36 block变量的使用 37 block变量名(实参); 38 无参有返回值 39 40 无参无返回值 41 格式: void (^block变量名)()= ^(){ 42 代码块的语句; 43 }; 44 优化: 45 void (^block变量名)()= ^{ 46 代码块的语句; 47 }; 48 block变量的使用 49 block变量名(); 50 */ 51 void (^myBlock)()= ^{ 52 NSLog(@"******"); 53 }; 54 myBlock(); 55 //定义一个变量myBlock1,同时进行赋值 56 void(^myBlock1)(int,int)=^(int a,int b){ 57 58 NSLog(@"a+b= %d",a+b); 59 }; 60 myBlock1(10,20); 61 //定义一个变量myBlock1,后进行赋值 62 myBlock1 = ^(int a,int b){ 63 64 int m = a>b?a:b; 65 NSLog(@"max=%d",m); 66 }; 67 myBlock1(10,20); 68 int (^myBlock2)(int,int) = ^(int x,int y){ 69 return x+y; 70 }; 71 int sum = myBlock2(10,30); 72 NSLog(@"sum=%d",sum); 73 } 74 return 0; 75 } 76 77
3、Block的typedef
使用typedef定义Block类型。定义好以后就可以像普通数据类型那样使用了:
typedef 返回值类型 (^block类型名称)(形参列表);
1 #import <Foundation/Foundation.h> 2 3 int main(int argc, const char * argv[]) { 4 @autoreleasepool { 5 6 // 定义一个block变量,并且赋值 7 void (^myBlock)() = ^{ 8 9 NSLog(@"helloworld"); 10 11 }; 12 13 myBlock(); 14 15 //定义一个别名 16 // 给 没有返回值 没有参数的block起一个别名 17 // Block 是一个类型,不在是一个单纯的变量了 18 typedef void (^Block)(); 19 Block b1; 20 //block类型的变量 21 b1 =^{ 22 NSLog(@"helloworld"); 23 }; 24 25 b1(); 26 27 //定义有参数\有返回值的 block类型 28 //定义新的别名 29 //返回值是int 有两个 int类型的参数 30 typedef int (^NewType1)(int ,int ); 31 32 NewType1 nt1 = ^(int a,int b){ 33 34 return a+b; 35 36 }; 37 38 //连续定义多个 NewType类型的变量 39 NewType1 n1,n2,n3; 40 n1 = ^(int x,int y){ 41 42 return x>y?x:y; 43 }; 44 45 int s = nt1(12,23); 46 NSLog(@"s = %d",s); 47 48 49 } 50 return 0; 51 }
4、block访问外部变量
1 #import <Foundation/Foundation.h> 2 /** 3 * block内部访问外部值的问题 4 * block内部不允许修改外部变量值 5 */ 6 void test(){ 7 8 int m = 10; 9 10 NSLog(@"1:m = %d",m); //10 11 NSLog(@"2:m addr = %p",&m); //栈区 12 // NSString *str = @"abc"; 13 // NSLog(@"str = %p",str); 14 15 //定义变量,并且赋值 16 //当定义block的时候,block会把外部变量以const的方式复制一份 17 //存放到block的所在的内存中 18 void (^myBlock)()=^{ 19 //m的值不能被修改 20 //m = 100; 21 22 NSLog(@"5:m addr = %p",&m); //堆区 23 //可以访问m的值 24 NSLog(@"3:in block m = %d",m); // ? 25 26 }; 27 28 NSLog(@"4:m addr = %p",&m); //栈区 29 //使用 30 myBlock(); 31 32 33 // 1 2 4 5 3 34 35 36 } 37 //int n=0; 38 int main(int argc, const char * argv[]) { 39 @autoreleasepool { 40 41 __block int m = 10; 42 NSLog(@"1:m add = %p",&m); //栈区地址 43 44 //__block 不在以const的方式拷贝 45 void (^myBlock)()=^{ 46 //m的值不能被修改 47 m = 100; 48 // n = 10; 49 // int m = 100; 50 NSLog(@"5:m addr = %p",&m); //堆区 51 //可以访问m的值 52 NSLog(@"3:in block m = %d",m); // ? 53 54 }; 55 myBlock(); 56 57 NSLog(@"6:m = %d",m); // ? 58 NSLog(@"7:m addr = %p",&m); 59 60 } 61 return 0; 62 }
【Protocol】
1、protocol概念
Protocol翻译过来, 叫做”协议”
中文解释:经过谈判、协商而制定的共同承认、共同遵守的文件。遵守了协议意味着一定会做协议中规定的事情。
Protocol的作用
用来声明一些方法
也就说, 一个Protocol是由一系列的方法声明组成的
任何类只要遵守了Protocol, 就相当于拥有了Protocol的所有方法声明
2、Protocol的定义
@protocol 协议名称
// 方法声明列表
@end
类遵守协议
@interface 类名 : 父类 <协议名称1, 协议名称2,…>
@end
协议中有2个关键字可以控制方法是否要实现(默认是@required,在大多数情况下,用途在于程序员之间的交流)
@required:这个方法必须要实现(若不实现,编译器会发出警告)
@optional:这个方法不一定要实现
3、Protocol使用流程
4、protocol中的@required 和 @optional
1 #import <Foundation/Foundation.h> 2 3 @protocol baseProtocol <NSObject> 4 //@required 和 @optional 都是协议中的关键字 5 //@required 修饰的方法是必须要实现的 6 @required //默认情况下都是必须要实现的 7 -(void)run; 8 -(void)eat; 9 10 //@optional 修饰的方法是可以实现,也可以不实现的 11 @optional 12 -(void)dajia; 13 14 @end
5、协议遵守协议
一个协议可以遵守其他多个协议
一个协议遵守了其他协议,就相当于拥有了其他协议中的方法声明
@protocol 协议名称 <协议1, 协议2>
@end
基协议
NSObject是一个基类,最根本最基本的类,任何其他类最终都要继承它
还有名字也叫NSObject的协议,它是一个基协议,最根本最基本的协议
NSObject协议中声明很多最基本的方法
建议每个新的协议都要遵守NSObject协议
注意
代理设计模式的主要目的:
解耦(主类不再依赖特定的某个类型,而是依赖代理,而很多类型都可以作为代理)
增加了程序的灵活性、可扩展性
Protocol(协议)是实现代理的一种手段。
补充:
用协议的原因:
1.有时候很难抽象共同的父类
2.类只能单继承。
3.解耦,不再依赖于某个具体的类型,任何类型都可以, 只要遵守了协议。
黑马程序员---OC基础8【block类型】【Protocol】
标签:
原文地址:http://www.cnblogs.com/snowimba/p/4859244.html