前天夜晚下大暴雨 电闪雷鸣 机房停电。补上block
BLOCK
BLOCK是什么?苹果推荐的类型,效率高,在运行中保存代码。用来封装和保存代码,有点像函数,BLOCK可以在任何时候执行。
BOLCK和函数的相似性:(1)可以保存代码(2)有返回值(3)有形参(4)调用方式一样。
// 定义一个无参数block
1 // 定义一个无参数block 2 void (^blockios)(); 3 blockios = ^{ 4 NSLog(@"第一一个block"); 5 }; 6 7 void (^blocks)() =^(){ 8 NSLog(@"第一一个block"); 9 }; 10 blocks();// 运行block 11 //无形参block可以省略等号右边的括号 12 void (^MyBlocks)() = ^{ 13 }; 14 MyBlocks();// 运行block
练习
1 //计算两个整数的和 2 int (^sumBlock)(int,int) = ^(int a,int b) 3 { 4 return a + b; 5 }; 6 int c = sumBlock(3,6); 7 NSLog(@"%d",c); 8 9 10 //用有参数block打印6条横线 11 void (^Myline)(int) = ^(int n) 12 { 13 for (int i = 0; i < n; i++) { 14 NSLog(@"----------------"); 15 } 16 }; 17 Myline(6);
用typedef 定义Block 省略每次都需重新定义的block语法 在类名前 头文件上定义 让代码更简洁
定义对象的语法前加关键字typedef,剩下的不变,原本定义的对象标识符换成类型标识符,对应语义从定义一个对象改成定义一个类型别名。
1 typedef int (^MyBlock)(int,int);//定义一个有返回值有形参block
2 typedef void (^Myblocks)(int,int);//定义一个无返回值有形参block
3 typedef void (^MyBlocksNo)();// 定义一个无参数block
赋值代码
1 MyBlock minusBlock; 2 minusBlock = ^(int a,int b) 3 { 4 return a - b; 5 }; 6 7 MyBlock sumBlock = ^(int a,int b) 8 { 9 return a + b; 10 }; 11 12 NSLog(@"%d-%d",minusBlock(9,8),sumBlock(6,6)); 13 14 Myblocks jiafa = ^(int a,int b) 15 { 16 NSLog(@"%d",a + b); 17 }; 18 jiafa(6,6); 19 20 MyBlocksNo newBlock =^{ 21 NSLog(@"无参数block"); 22 }; 23 newBlock(); 24 //连续用block变量定义2个block 25 MyBlock jia,sum; 26 jia = ^(int a,int b){ 27 return a + b; 28 }; 29 sum = ^(int c, int d) 30 { 31 return c + d; 32 };
block内部只能改变外部有关键字__block声明的成员变量
int a = 6; __block int b = 9;//_ _block(两个横杠) void (^blockos)(); blockos = ^{ // a = 9; // variable is not assignable (missing_block type specifier) block内部使用外部变量错误提示:需要添加关键字__block b = 6; };
总结
1 /* 2 1>如何定义block变量 3 int (^blocks)(int,int); 4 void (^blocks)(); 5 2>利用block封装代码的几种方式 6 ^ (int a,int b){ 7 return a + b; 8 }; 9 10 ^(){ 11 NSLog(@"无参数block"); 12 }; 13 14 ^{ 15 NSLog(@"无参数block"); 16 }; 17 3>block访问外面变量 18 block内部可以访问外部变量 19 默认情况下,block内部不能修改外面局部变量 20 给局部变量加上_block关键字,这个局部变量就可以在block内部修改。 21 4>利用typedf定义block类型 22 typedf int (^MyBlock)(int,int);//最常用定义block 23 MyBlock myblock;//定义一个block 24 MyBlock sum1,sum2;//连续定义两个block 25 给block 赋值 26 sum1 = ^(int a,int b){ 27 return a + b; 28 }; 29 MyBlock sum3 = ^(int a,int b) 30 { 31 return a - b; 32 }; 33 34 */
附学习代码
1 // 2 // main.m 3 // Block 4 // 5 // Created by zjj on 15/4/27. 6 // Copyright (c) 2015年 zjj. All rights reserved. 7 // 8 9 #import <Foundation/Foundation.h> 10 typedef int (^MyBlock)(int,int); 11 typedef void (^Myblocks)(int,int); 12 typedef void (^MyBlocksNo)(); 13 int main() 14 { 15 /* 16 1>如何定义block变量 17 int (^blocks)(int,int); 18 void (^blocks)(); 19 2>利用block封装代码的几种方式 20 ^ (int a,int b){ 21 return a + b; 22 }; 23 24 ^(){ 25 NSLog(@"无参数block"); 26 }; 27 28 ^{ 29 NSLog(@"无参数block"); 30 }; 31 3>block访问外面变量 32 block内部可以访问外部变量 33 默认情况下,block内部不能修改外面局部变量 34 给局部变量加上_block关键字,这个局部变量就可以在block内部修改。 35 4>利用typedf定义block类型 36 typedf int (^MyBlock)(int,int);//最常用定义block 37 MyBlock myblock;//定义一个block 38 MyBlock sum1,sum2;//连续定义两个block 39 给block 赋值 40 sum1 = ^(int a,int b){ 41 return a + b; 42 }; 43 MyBlock sum3 = ^(int a,int b) 44 { 45 return a - b; 46 }; 47 48 */ 49 int a = 6; 50 __block int b = 9; 51 void (^blockos)(); 52 blockos = ^{ 53 // a = 9; // variable is not assignable (missing_block type specifier) block内部使用外部变量错误提示:需要添加关键字__block 54 b = 6; 55 }; 56 57 return 0; 58 } 59 void test2() 60 { 61 MyBlock minusBlock; 62 minusBlock = ^(int a,int b) 63 { 64 return a - b; 65 }; 66 67 MyBlock sumBlock = ^(int a,int b) 68 { 69 return a + b; 70 }; 71 72 NSLog(@"%d-%d",minusBlock(9,8),sumBlock(6,6)); 73 74 Myblocks jiafa = ^(int a,int b) 75 { 76 NSLog(@"%d",a + b); 77 }; 78 jiafa(6,6); 79 80 MyBlocksNo newBlock =^{ 81 NSLog(@"无参数block"); 82 }; 83 newBlock(); 84 //连续用block变量定义2个block 85 MyBlock jia,sum; 86 jia = ^(int a,int b){ 87 return a + b; 88 }; 89 sum = ^(int c, int d) 90 { 91 return c + d; 92 }; 93 } 94 95 void tets1() 96 { 97 //计算两个整数的和 98 int (^sumBlock)(int,int) = ^(int a,int b) 99 { 100 return a + b; 101 }; 102 int c = sumBlock(3,6); 103 NSLog(@"%d",c); 104 105 106 //用有参数block打印6条横线 107 void (^Myline)(int) = ^(int n) 108 { 109 for (int i = 0; i < n; i++) { 110 NSLog(@"----------------"); 111 } 112 }; 113 Myline(6); 114 } 115 void tets() 116 { 117 // 定义一个无参数block 118 void (^blockios)(); 119 blockios = ^{ 120 NSLog(@"第一一个block"); 121 }; 122 123 void (^blocks)() =^(){ 124 NSLog(@"第一一个block"); 125 }; 126 blocks();// 运行block 127 //无形参block可以省略等号右边的括号 128 void (^MyBlocks)() = ^{ 129 }; 130 MyBlocks();// 运行block 131 }
Protocol(协议)
(一)简介
1.Protocol:就一个用途,用来声明一大堆的方法(不能声明成员变量),不能写实现。
2.只要某个类遵守了这个协议,就拥有了这个协议中的所有方法声明。
3.只要父类遵守了某个协议,那么子类也遵守。
4.Protocol声明的方法可以让任何类去实现,protocol就是协议。
5.OC不能继承多个类(单继承)但是能够遵守多个协议。继承(:),遵守协议(< >)
6.基协议:<NSObject>是基协议,是最根本最基本的协议,其中声明了很多最基本的方法。
7.协议可以遵守协议,一个协议遵守了另一个协议,就可以拥有另一份协议中的方法声明。
创建一个协议
xcode 6.2 在创建oc 类列表里面选择protocol
协议里面写一些待实现的方法名。
1 // 2 // MyProtocol.h 3 // protocol 4 // 5 // Created by zjj on 15/4/27. 6 // Copyright (c) 2015年 zjj. All rights reserved. 7 // 8 9 #import <Foundation/Foundation.h> 10 11 @protocol MyProtocol 12 13 //@required 要求实现,不实现就会发出警告 目的在于程序员的交流。默认实现 14 //@optional 不要求实现 实不实实现都不发出警告。 15 - (void)test; 16 @required 17 - (void)test1; 18 @optional 19 - (void)test2; 20 - (void)test4; 21 @end
遵守协议 <>
1 #import <Foundation/Foundation.h> 2 //#import "MyProtocol.h" 3 //MyProtocol2#import "MyProtocol2.h" 4 //#import "MyProtocol3.h" 5 @class Hashiqi; 6 @protocol MyProtocol; 7 @protocol MyProtocol2; 8 @protocol MyProtocol3; 9 10 // 声明协议方法 <> 11 //只要一个类遵循了谋一份协议就能拥有这份协议中的所有方法声明 12 @interface Person : NSObject <MyProtocol2,MyProtocol3> 13 @property (nonatomic, strong) id<MyProtocol2> obj; 14 @property (nonatomic, strong) Hashiqi *dog; 15 @end
完成协议中的方法实现
1 #import "Person.h" 2 3 @implementation Person 4 5 - (void)haha2 6 { 7 8 } 9 - (void)hehe 10 { 11 12 } 13 - (void)test 14 { 15 16 } 17 - (void)test1 18 { 19 20 } 21 - (void)haha 22 { 23 24 } 25 @end
协议遵循协议
创建一个协议 MyProtocol1 和 一个协议 MyProtocol2
1 // 2 // MyProtocol1.h 3 // 协议遵循协议 4 // 5 // Created by zjj on 15/4/28. 6 // Copyright (c) 2015年 zjj. All rights reserved. 7 // 8 9 #import <Foundation/Foundation.h> 10 11 @protocol MyProtocol1 <NSObject> 12 - (void)eat; 13 @end
让 MyProtocol2 遵守 MyProtocol1 协议
1 // 2 // MyProtocol2.h 3 // 协议遵循协议 4 // 5 // Created by zjj on 15/4/28. 6 // Copyright (c) 2015年 zjj. All rights reserved. 7 // 8 9 #import <Foundation/Foundation.h> 10 11 #import "MyProtocol1.h" 12 //@protocol MyProtocol1;//code 6.2使用该协议声明会报错 13 14 @protocol MyProtocol2 <MyProtocol1> 15 - (void)cry; 16 @optional 17 - (void)color; 18 @end
类的遵循协议2
1 // 2 // cat.h 3 // 协议遵循协议 4 // 5 // Created by zjj on 15/4/28. 6 // Copyright (c) 2015年 zjj. All rights reserved. 7 // 8 9 #import <Foundation/Foundation.h> 10 #import "MyProtocol2.h" 11 //@protocol MyProtocol2; 12 13 @interface Cat : NSObject <MyProtocol2> 14 15 @end
完成类中所遵循协议实现
1 // 2 // Cat.m 3 // 协议遵循协议 4 // 5 // Created by zjj on 15/4/28. 6 // Copyright (c) 2015年 zjj. All rights reserved. 7 // 8 9 #import "Cat.h" 10 //#import "MyProtocol2.h" 11 @implementation Cat 12 - (void)cry 13 { 14 NSLog(@"猫咪叫"); 15 } 16 - (void)eat 17 { 18 NSLog(@"猫甜食"); 19 } 20 @end
测试
1 // 2 // main.m 3 // 协议遵循协议 4 // 5 // Created by zjj on 15/4/28. 6 // Copyright (c) 2015年 zjj. All rights reserved. 7 // 8 9 #import <Foundation/Foundation.h> 10 #import "Cat.h" 11 int main(int argc, const char * argv[]) { 12 Cat *cat = [[Cat alloc]init]; 13 [cat eat]; 14 [cat cry]; 15 return 0; 16 }
2015-04-28 13:54:32.900 协议遵循协议[682:24363] 猫甜食 2015-04-28 13:54:32.903 协议遵循协议[682:24363] 猫咪叫 Program ended with exit code: 0
协议总结
oc里只有单继承 可以遵守多协议
1.协议的定义
@protocol 协议名称 <NSObject>
//方法声明列表
@end;
2.如何遵守协议
(1)类遵守协议
@protocol 类名:父类名 <协议名称1,协议名称2>
@end
(2)协议遵守协议
@protocol 协议名称 <其他协议名称>
@end;
3.协议方法声明中的关键字
(1)required (默认)要求实现,若没有实现则警告但不报错
(2)Optional 不要求实现
4.定义变量时遵守协议的限制
类名<协议名称> *变量名 NSObject<.Myprotocol> *obj;
Id <协议名称> 变量名 id <.Myprotocol> obj1;
5.Property中声明的属性也可以做遵守协议的限制
@property (nonatomic ,strong ) 类名<协议名称> *属性名;
@property (nonatomic ,strong ) id<协议名称> 属性名;
6.补充知识:协议本身写在.h头文件中,但也可以定义在任何地方。当这个协议只有这个类使用遵守时,一般把协议写在这个类里边,当这个协议需要多个类去实现时,就写在外边单独的文件中。