黑马程序员-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];


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文件中,也可用定义在原来类中
①、一般情况下,都是定义在单独文件中。
②、定义在原来类中的文件,只要求能看懂语法。
0 0
原创粉丝点击