黑马程序员————OC内存管理_Block和@protocol
2015-04-22 21:46
357 查看
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
1.没有返回值,没有形参的Block
Block用来保存一段代码
Block跟函数很像:
2.有返回值,有形参的的block
利用Block输出n条横线
3.block可以访问外部变量
1)默认情况下,block内部不能修改外面的局部变量
2)给局部变量加上_block关键字,这个局部变量就可以在block内部修改
打印结果
4.利用typedef定义block类型
二、@protocol 协议
1.基本用途
1)用来声明一大堆方法(不能声明成员变量)
2)只要某个类遵守这个协议,就相当于拥有这个协议中所有的方法声明
3)只要父类遵守了某协议,相当于子类也遵守了
2.格式
3.关键字
@required:(默认)必须实现,不然警告
@optional:(随意)不要求实现
4.协议遵守协议
1)一个协议可以遵守其它多个协议,多个协议之间用逗号隔开
2)一个协议遵守了其它协议,就相当于拥有了其它协议的方法声明
3)@protocol 协议名称 <其它协议1,其它协议2>
@end
5.基协议
NSObject:是一个基协议,最根本最基本的协议
6.定义一个变量的时候,限制这个变量保存的对象遵守某个协议
7.@property中声明的属性也可以用做一个遵守协议的限制
8.协议可用定义在单独.h文件中,也可用定义在某个类中
1)如果这个协议只用在某个类中,应该把协议定义在该类中
2)如果这个协议用在很多类中,就应该定义在单独文件中
9.分类可用定义在单独.h和.m文件中,也可用定义在原来类中
1)一般情况下,都是定义在单独文件中
2)定义在原来类中的分类,只要求能看懂语法
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
一、Block
Block也是一种数据类型,效率比较高,用来封装一段代码,可以在任何时候执行1.没有返回值,没有形参的Block
Block用来保存一段代码
// Block的标志 ^
#import <Foundation/Foundation.h> int main() { // 定义block变量 void(^myblock)() = ^{ NSLog(@"————————"); }; // 利用block变量调用block内部的代码 myblock(); return 0; }
Block跟函数很像:
/* 1)可以保存代码 2)有返回值 3)有形参 4)调用方式一样 */
2.有返回值,有形参的的block
#import <Foundation/Foundation.h> int main() { int (^sumblock)(int,int)= ^(int a,int b){ return a + b; }; NSLog(@"%d",sumblock(4,5)); return 0; }输出结果:
2015-04-22 20:19:29.945 Block2[31694:2747511] 9
利用Block输出n条横线
#import <Foundation/Foundation.h> int main() { // 用一个block来输出n条横线 void (^lineblock)(int) = ^(int n){ for(int i = 0;i < n;i++) { NSLog(@"————————————"); } }; lineblock(3); return 0; }
2015-04-22 20:25:18.139 Block2[31740:2748833] ———————————— 2015-04-22 20:25:18.140 Block2[31740:2748833] ———————————— 2015-04-22 20:25:18.140 Block2[31740:2748833] ————————————
3.block可以访问外部变量
1)默认情况下,block内部不能修改外面的局部变量
2)给局部变量加上_block关键字,这个局部变量就可以在block内部修改
#import <Foundation/Foundation.h> int main() { // 下划线是两横 __block int b = 20; void (^block)() = ^{ b = 30; }; block(); NSLog(@"%d",b); return 0; }
打印结果
2015-04-22 20:40:36.663 Block2[31816:2752837] 30
4.利用typedef定义block类型
// 以后就可以利用myblock这种类型来定义block变量 typedef int (^myblock)(int,int); myblock block; myblock b1; b1 = ^(int a,int b){ return a + b; }; myblock b3 = ^(int a,int b){ return a - b; };
二、@protocol 协议
1.基本用途
1)用来声明一大堆方法(不能声明成员变量)
2)只要某个类遵守这个协议,就相当于拥有这个协议中所有的方法声明
3)只要父类遵守了某协议,相当于子类也遵守了
2.格式
<pre name="code" class="objc"> /* 协议的定义 @protocol 协议名称 <NSObject> // 方法声明实现 @end */
3.关键字
@required:(默认)必须实现,不然警告
@optional:(随意)不要求实现
4.协议遵守协议
1)一个协议可以遵守其它多个协议,多个协议之间用逗号隔开
2)一个协议遵守了其它协议,就相当于拥有了其它协议的方法声明
3)@protocol 协议名称 <其它协议1,其它协议2>
@end
/* // 类遵守协议 @interface 类名 :父类名<协议名称1,协议名称2> @end */
5.基协议
NSObject:是一个基协议,最根本最基本的协议
6.定义一个变量的时候,限制这个变量保存的对象遵守某个协议
// id <协议名称> 变量名 id <myprotocol> obj2; // 如果没有遵守对应的协议,编译器会警告 NSObject <myprotocol> *obj;
7.@property中声明的属性也可以用做一个遵守协议的限制
// @property (nonatomic,strong)类名 <协议名> *属性名; @property (nonatomic,strong) Dog <myprotocol> *dog; // @property (nonatomic,strong)id <协议名> 属性名; @property (nonatomic,strong) id <myprotocol> dog;
8.协议可用定义在单独.h文件中,也可用定义在某个类中
1)如果这个协议只用在某个类中,应该把协议定义在该类中
2)如果这个协议用在很多类中,就应该定义在单独文件中
9.分类可用定义在单独.h和.m文件中,也可用定义在原来类中
1)一般情况下,都是定义在单独文件中
2)定义在原来类中的分类,只要求能看懂语法
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
相关文章推荐
- 黑马程序员——OC语言学习——ARC机制、block代码块、protocol协议、protocol协议的应用
- 黑马程序员——OC基础---block,protocol
- 黑马程序员(OC特有语法-block和-Protocol)
- 黑马程序员_OC_ARC,block,protocol
- 黑马程序员——OC基础---Block、protocol
- 黑马程序员-[OC]学习之旅-block和protocol的概念及使用
- 【黑马程序员】-oc中的block和protocol
- 黑马程序员——OC之ARC、Block、Protocol
- 黑马程序员 OC基础: Block 和 Protocol
- 黑马程序员——OC语法 block和protocol
- 黑马程序员————OC语言BLOCK和Protocol总结
- 黑马程序员——OC学习小结------arc,block,protocol(协议)
- 黑马程序员---OC基础---Block、分类Category、协议protocol
- 黑马程序员_OC_block和protocol协议
- 黑马程序员——OC热身——Category、Protocol、Block、常用结构体
- 黑马程序员——OC基础04—block、protocol
- 黑马程序员——OC基础:block和Protocol及Category
- 黑马程序员——OC—block和protocol协议
- 黑马程序员员—OC(block和protocol)
- 黑马程序员——OC语言------Block、protocol协议、代理设计