黑马程序员——OC语言——block、protocol、代理模式
2015-01-15 15:11
405 查看
———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>
@end
3、作用
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、保证能解耦
实现方法
1、定义1个protocol,在其中声明一些和代理沟通的方法
2、拥有一个代理属性id<protocol>delegate
3、让代理遵守protocol
Person.h
#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];
}
相关文章推荐
- 黑马程序员——10、OC语言(block、protocol和代理模式)
- 黑马程序员——OC语言------Block、protocol协议、代理设计
- 黑马程序员——OC学习——Protocol和代理设计模式
- OC-10-其他:block、protocol、代理设计模式
- ObjectC语言基础1—block、protocol、代理设计模式
- OC_语法入门_day6_ARC(循环引用)/block代码块(闭包)/protocol协议(接口)/代理模式
- 黑马程序员——OC语言之代理模式
- Oc语言之Protocol代理设计模式
- 黑马程序员——入学Blog05----OC的protocol与代理模式
- OC语言 block 和 代理模式
- 黑马程序员——OC基础学习(五)---分类(Category),代码块Block和protocol代理设计模式
- 黑马程序员——OC语言学习——ARC机制、block代码块、protocol协议、protocol协议的应用
- 黑马程序员————OC语言BLOCK和Protocol总结
- 黑马程序员——OC语言基础篇---block和protocol
- OC语言之学习篇——03——代理模式
- OC---protocol代理设计模式
- 黑马程序员-OC语言之block
- 黑马程序员-OC语言Block
- 黑马程序员--oc:block与protocol
- 黑马程序员——OC语言Protocol(协议)