黑马程序员-iOS基础之OC重点语法(Block、Protocol)
来源:互联网 发布:上海上知营销策划公司 编辑:程序博客网 时间:2024/05/17 09:39
<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流!
OC重点语法(Block、Protocol)
<一>、Block
1、block的基本使用
①、block封装了一段代码,可以在任何时候执行
②、block可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值
③、苹果官方建议尽量多用block,在多线程、异步任务、集合遍历、集合排序、动画转场用的很多。
2、block与函数
①、可以保存代码
②、有返回值
③、有形参
④、调用方式一样
//代码如下void (^MyBlock)() = ^(){{ //语句};//利用block变量调用block内部的代码myblock();//代码解析//myblock 是block的变量//^(){}; 是没有返回值没有参数的block体//如果block没有形参可以省略后面的()
3、带有参数和返回值的block
int (^sumblock)(int,int) = ^(int a,int b){ return a + b;};
4、block使用typedef定义block类型
语法:
typedef int (^myblock)(int,int);
此时,myblock就成了类型。可以根据类型创建对象。
5、block总结
block要掌握的内容:
(1)、如何定义block变量
int (^sumblock)(int,int);//有参数,有返回值
void (^myblock)();//无参数,无返回值
(2)、如何利用block封装代码
^(int a,int b){return a - b; };
^(){NSLog(@"-------"); };
(3)、block访问外面变量
①、block内部可以访问外面的变量
②、默认情况下,block内部不能修改外面的局部变量
③、给局部变量加上__block关键字,这个局部变量就可以在block内部修改了
(4)、利用typedef定义block类型
typedef int ^(MyBlock)(int,int);
以后就可以利用block这个类型定义block变量
MyBlock b1,b2;
b1 = ^(int a,int b){
return a - b;
};
<二>、Protocol
1、protocol基本使用
①、可以用来声明一大堆方法(不能声明成员变量)。
②、只要某个类遵守了这个协议,就相当于拥有了这个协议的所有方法声明。
③、只要父类遵守了某个协议,就相当于子类也遵守了。
2、语法格式
①、协议的编写
@protocol 协议名称
//方法声明列表
@end
②、某个类遵守了协议
@interface 类名:父类 <协议名称>
@end
3、关键字
协议中有2个关键字可以控制方法是否要实现(默认是@required),在大多数情况下,用途在于程序员之间的交流。
只要一个类遵守了某一份协议,就能拥有这份协议的所有方法声明。
定义一个名叫 MyProtocol的协议
@protocol MyProtocol
//一系列方法声明
@end
: 代表 继承父类
<>代表 遵守协议
@interface Person : NSObject <MyProtocol>
...
@end
4、协议遵守协议
一个协议遵守其他多个协议,多个协议之间用逗号隔开
一个协议遵守其他多个协议,就相当于拥有了其他协议的方法声明
语法:
@protocol 协议名称 <协议1,协议2>
...
@end
5、protocol
语法:
@protocol MyProtocol <NSObject>
@required
method1;
@optional
method2;
@end
①、被@required修饰的方法要求实现,不然会发出警告,但不影响程序的正常运行。默认是@required
②、被@optional修饰的方法不一定要实现,不会发出警告
③、父类只能有一个,但协议可以遵守多个。
6、protocol协议间的遵守,基协议
①、NSObject是一个基类,最根本最基本的类,任何其他类最终都要继承它。
②、其实还有一个协议,名字也叫NSObject,它就是一个基协议,最根本最基本的协议。任何协议也都遵守它。
③、NSObject协议中声明很多最基本的方法,比如:description、retain、release、autorelease等
④、建议每个新的协议都要遵守NSObject协议。
7、protocol 限制对象类型
首先,我们来创建两个对象
NSObject *obj = [ [NSObject alloc] init];
NSObject *obj2 = @"12345";
那么,如果我们要对对象类型进行限制的时候,我们就该使用协议了。
//MyProtocol遵守了基协议
@protocol MyProtocol <NSObject>
- (void)say;
@end
//Person类又遵守了MyProtocol协议
@interface Person : NSObject <MyProtocol>
@property (nonatomic,strong) id<MyProtocol> obj;//设置值的时候,一定要遵守协议
@end
NSObject<MyProtocol> *obj3 = [ [Person alloc] init];
或
id<MyProtocol> obj4 = [ [Person alloc] init];
//要求obj5,保存的对象必须遵守MyProtocol、并且集成了Person
Person<MyProtocol> *obj = [ [Person alloc] init];
首先,我们来创建两个对象
NSObject *obj = [ [NSObject alloc] init];
NSObject *obj2 = @"12345";
那么,如果我们要对对象类型进行限制的时候,我们就该使用协议了。
//MyProtocol遵守了基协议
@protocol MyProtocol <NSObject>
- (void)say;
@end
//Person类又遵守了MyProtocol协议
@interface Person : NSObject <MyProtocol>
@property (nonatomic,strong) id<MyProtocol> obj;//设置值的时候,一定要遵守协议
@end
NSObject<MyProtocol> *obj3 = [ [Person alloc] init];
或
id<MyProtocol> obj4 = [ [Person alloc] init];
//要求obj5,保存的对象必须遵守MyProtocol、并且集成了Person
Person<MyProtocol> *obj = [ [Person alloc] init];
Protocol总结:
1、协议的定义
@protocol 协议名称 <NSObject>
//方法声明列表...
@end
2、如何遵守协议
①、类遵守协议
@interfalce 类名 : 父类名 <协议名称1,协议名称2>
@end
②、协议遵守协议
@protocol 协议名称 <其他协议名称1,其他协议名称2>
@end
3、协议中方法声明的关键字
①、@required(默认)
要求实现,如果没有实现,会发出警告
②、@optional
不要求实现,怎样都不会警告
4、定义一个变量的时候,限制这个变量保存的对象遵守某个协议
类名<协议名称> *变量名;
id<协议名称> 变量名;
NSObject<MyProtocol> *obj;
id<MyProtocol> obj2;
如果没有遵守对应的协议,编译器会警告
5、@property中声明的属性也可以做一个遵守协议的限制
@property (nonatomic,strong) 类名<协议名称> *属性名;
@property (nonatomic,strong) id<协议名称> 属性名;
@property (nonatomic,strong) Dog<MyProtocol> *dog;
@property (nonatomic,strong) id<MyProtocol> dog;
6、协议可用定义在单独.h文件中,也可用定义在某个类中
①、如果这个协议用在很多类中,就应该把协议定义在该类中。
②、如果这个协议用在很多类中,就应该定义在单独文件中。
7、分类可用定义在单独.h和.m文件中,也可用定义在原来类中
①、一般情况下,都是定义在单独文件中。
②、定义在原来类中的文件,只要求能看懂语法。
@protocol 协议名称 <NSObject>
//方法声明列表...
@end
2、如何遵守协议
①、类遵守协议
@interfalce 类名 : 父类名 <协议名称1,协议名称2>
@end
②、协议遵守协议
@protocol 协议名称 <其他协议名称1,其他协议名称2>
@end
3、协议中方法声明的关键字
①、@required(默认)
要求实现,如果没有实现,会发出警告
②、@optional
不要求实现,怎样都不会警告
4、定义一个变量的时候,限制这个变量保存的对象遵守某个协议
类名<协议名称> *变量名;
id<协议名称> 变量名;
NSObject<MyProtocol> *obj;
id<MyProtocol> obj2;
如果没有遵守对应的协议,编译器会警告
5、@property中声明的属性也可以做一个遵守协议的限制
@property (nonatomic,strong) 类名<协议名称> *属性名;
@property (nonatomic,strong) id<协议名称> 属性名;
@property (nonatomic,strong) Dog<MyProtocol> *dog;
@property (nonatomic,strong) id<MyProtocol> dog;
6、协议可用定义在单独.h文件中,也可用定义在某个类中
①、如果这个协议用在很多类中,就应该把协议定义在该类中。
②、如果这个协议用在很多类中,就应该定义在单独文件中。
7、分类可用定义在单独.h和.m文件中,也可用定义在原来类中
①、一般情况下,都是定义在单独文件中。
②、定义在原来类中的文件,只要求能看懂语法。
0 0
- 黑马程序员-iOS基础之OC重点语法(Block、Protocol)
- 黑马程序员(OC特有语法-block和-Protocol)
- 黑马程序员—IOS基础之OC—block和protocol
- 黑马程序员------OC基础-----block和protocol
- 黑马程序员 OC基础: Block 和 Protocol
- 黑马程序员-IOS基础之OC语法
- 黑马程序员IOS基础---OC学习之Protocol
- 黑马程序员——OC语法 block和protocol
- 黑马程序员——OC基础---block,protocol
- 黑马程序员---OC基础---Block、分类Category、协议protocol
- 黑马程序员——OC基础---Block、protocol
- 黑马程序员——OC基础04—block、protocol
- 黑马程序员-IOS-OC基础-Block
- 黑马程序员- IOS学习笔记-OC ARC、BLOCK、protocol
- 黑马程序员——OC之ARC、Block、Protocol
- 黑马程序员-OC笔记(六)ARC Block protocol
- 黑马程序员员—OC(block和protocol)
- 黑马程序员------OC block(代码块)和protocol(协议)
- C字符串处理函数
- C# int字节 转换Byte数组 3位
- Eddy's picture
- armv7s报错: file is universal (4 slices) but does not contain a(n) armv7s slice
- [转]互联网推送服务原理:长连接+心跳机制
- 黑马程序员-iOS基础之OC重点语法(Block、Protocol)
- 自定义dialog布局遇到的问题
- Maven依赖排除 禁止依赖传递 取消依赖的方法
- HDU 5347 MZL's chemistry
- hdu 5348 MZL's endless loop(dfs)
- 使用Git命令从Github下载代码仓库
- Android Studio 那些事| ' ' cannot be applied to '(groovy.lang.Closure)'
- dojo中 的 grid 的改进:增加分页导航条
- exp和imp参数介绍