1.block
block也是一种数据类型,用来封装一段代码。
定义一个block变量,示例:
void (^myblock)();
int(^sumblock)(int,int);
void(^lineBlock)(int);
给block变量赋值一段代码,如:
void (^myblock)() = ^
{
NSLog(@"---------");
};
int(^sumblock)(int,int) = ^(int a,int b)
{
return a+b;
};
void(^lineBlock)(int) = ^(int n)
{
for(int i = 0;i<n;i++)
{
NSLog(@"~~~~~~~~");
}
};
利用block变量调用block内部的代码,示例:
myblock();
int c = sumblock(10,21);
lineBlock(5);
block内部可以访问外面的变量,默认情况下,block内部不能修改外面的局部变量,但是给局部变量加上_block关键字,这个局部变量就可以在block内部修改
typedef int(^MyBlock)(int,int); 利用typedef定义block类型,再利用MyBlock类型来定义block变量 MyBlock block;
2.protocol
protocol 是用来声明一大堆方法,而且在任何类中都可以使用,但是不能声明成员变量。使用protocol里面声明的方法要遵守protocol的协议:只要这个类遵守了某个协议,相当于拥有了这个协议中的所有方法声明,只要父类遵守了某个协议,相当于子类也遵守了。
@protocol MyProtocol // 定义了一个名叫MyProtocol的协议
@required // 要求实现,不实现就会发出警告,默认情况,protocol使用的两个关键字
- (void)test;
- (void)test2;
@optional // 不要求实现
- (void)test3;
@end
遵守协议的写法:说明这个类遵守了MyProtocol协议,他及他的子类都拥有这个协议里面所有的方法声明
@interface Person:NSObject <MyProtocol>
@end
另外一个类也可以遵守两个、多个协议
@interface Person:NSObject <MyProtocol,MyProtocol2>
@end
协议还可以遵守协议,即协议还可以拥有其他协议里面的方法声明:
@protocol MyProtocol3 <MyProtocol,MyProtocol2>
@end
基类也遵守了基协议NSObject,所有的协议都要遵守基协议NSObject
@protocol MyProtocol <NSObject>
@end
在项目开发中,有时候会要求变量保存的对象必须是遵守了某个协议的,如何实现呢?在类名后面写上协议名即可,代表保存的对象必须遵守这个协议,如(Person是遵守MyProtocol协议的):
NSObject <MyProtocol> *obj = [[Person alloc] init];
id <MyProtocol> obj2 = [[Person alloc] init];
在property参数中的表现形式:赋值的对象必须遵守MyProtocol协议
@property (nonatomic,strong) id <MyProtocol> obj;
@property (nonatomic,strong) NSObject <MyProtocol> *obj;