———Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ———
一、block
1、block用来封装一段代码,可以在任何时候执行
2、block的标识是^
3、block跟函数很类似:
1> 都可以保存代码
2> 都有返回值
3> 都有形参
4> 调用方式一样
4、block的定义
1> 不带参数,无返回值的block
void(^myblock)()=^{
NSLog[@"----------"];
};
调用:myblock()
2> 带参数,有返回值的block
int(^sumblock)(int , int)=^(int a , int b){
return a+b;
};
调用:int c =sumblock(10,11)
5、typedef定义block类型
//定义了一个Myblock类型
typedef int(^Myblock)(int ;int);
Myblock sumblock=^(int a , int b){
return a + b;
}
调用:sumblock(10,9)
6、block访问外面变量
1> block内部可以访问外面的变量
2> 默认情况下,block内部不能修改外面的局部变量
3> 给局部变量加上_block关键字,这个局部变量就可以在block内部修改
二、protocol
用来声明大量方法(不能声明成员变量)
1、协议的定义
@protocol 协议名称 <NSObject>
// 方法声明列表
@end
2、遵守协议
1> 类遵守协议
@interface 类名 : 父类名 <协议名称1, 协议名称2>
@end
2> 协议遵守协议
@protocol 协议名称 <其他协议名称1, 其他协议名称2>
3、作用@end
1> 一个类遵守了某个协议,就能拥有这份协议的所有方法声明。
2> 一个协议遵守了另一个协议,就可以拥有另一个协议的所有方法声明。
3> NSObject是一个基类,同时也有个NSObject的基协议,基协议里有很多最基本的方法,比如:description、 retain、release等。
4、协议方法中声明的关键字
1> @required(默认)
要求实现。若不实现,则发出警告
2> @optional
不要求实现
5、变量与协议
类名<协议名> *变量名;
// p1保存的对象必须遵守mypotocol协议
NSObject<myProtocol> *p1 = [[Person allot] init];
// p2保存的对象必须遵守mypotocol2协议
id<myProtocol2> *p2 = [[Person allot] init];
// p3保存的对象必须遵守mypotocol协议,且继承自Person
Person<myProtocol> *p3 = [[Person allot] init];
三、代理模式
设计原则:
1、拥有某个代理对象属性
2、清楚代理协议里的方法
3、保证能解耦
实现方法
Person.h1、定义1个protocol,在其中声明一些和代理沟通的方法
2、拥有一个代理属性id<protocol>delegate
3、让代理遵守protocol
#import <Foundation/Foundation.h>
//只 声明代理,不知其有哪些属性
@potocol TicketDelegate;
@interface Person : NSObject
// 拥有一个遵守TicketDelegate协议的代理属性(任意类型)
@property (nonatomic, strong) id <TicketDelegate> delegate;
- (void) buyTicket;
@end
Person.m
#import "Person.h"
@implementation Person
- (void) buyTicket
{
// 通过代理询问票价
double price = [_delegate ticketPrice];
NSLog(@"通过代理帮忙,票价是%f", price);
}
@end
TicketDelegate.h
#import <Foundaation/Foundation.h>
@protocol TicketDelegate <NSObject>
// 代理属性
- (double)ticketPrice;
@end
Agent.h
#import <Foundaation/Foundation.h>
#import "TicketDelegate.h"
// 遵守TicketDelegate协议
@interfaceAgent : NSObject <TicketDelegate>
@end
Agent.m
#import "Agent.h"
@implementation Agent
- (double)ticketPrice
{
return 1000;
}
@end
main.m
#import <Foundation/Foundation.h>
#import "Person.h"
#import "Agent.h"
int main()
{
Person *p = [[Person alloc] init];
Agent *a = =[[Agent alloc] init];
//p有一个代理为a
p.delegate = a;
[p buyTicket];
}