黑马程序员--oc:block与protocol

一、Block

 1.如何定义block变量

 int (^sumBlock)(int, int);

 void (^myBlock)();

 

 2. 如何利用block封装代码

 ^(int a, int b) {

    return a - b;

 };

 

 ^() {

    NSLog(@"----------");

 };

 

 ^ {

    NSLog(@"----------");

 };

 

 3. block访问外面变量

 * block内部可以访问外面的变量

 * 默认情况下,block内部不能修改外面的局部变量

 * 给局部变量加上__block关键字,这个局部变量就可以在block内部修改

 

 4.利用typedef定义block类型

 typedef int (^MyBlock)(int, int);

 // 以后就可以利用MyBlock这种类型来定义block变量

 MyBlock block;

 MyBlock b1, b2;

  b1 = ^(int a, int b) {

    return a - b;

 };

 

 MyBlock b3 = ^(int a, int b) {

    return a - b;

 };

 

二、protocol

 1.协议的定义

 @protocol 协议名称 <NSObject>

  // 方法声明列表....

 @end

 

 2.如何遵守协议

 1> 类遵守协议

 @interface 类名 : 父类名 <协议名称1, 协议名称2>

 @end

 

 2> 协议遵守协议

 @protocol 协议名称 <其他协议名称1, 其他协议名称2>

 @end

 

 3.协议中方法声明的关键字

 1> @required (默认)

   要求实现,如果没有实现,会发出警告

 

 2> @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> dog2;

 

 6.协议可用定义在单独.h文件中,也可用定义在某个类中

 1> 如果这个协议只用在某个类中,应该把协议定义在该类中

  2> 如果这个协议用在很多类中,就应该定义在单独文件中

 

 7.分类可用定义在单独.h和.m文件中,也可用定义在原来类中

 1> 一般情况下,都是定义在单独文件

 2> 定义在原来类中的分类,只要求能看懂语法

 

三、代理模式

TicketDelegate.h文件

#import <Foundation/Foundation.h>

 

// 声明一些跑腿方法

@protocol TicketDelegate <NSObject>

 

// 返回票价

- (double) ticketPrice;

 

// 还剩多少张票

- (int) leftTicketsNumber;

@end

 

Person.h文件

 

#import <Foundation/Foundation.h>

#import "TicketDelegate.h"

@interface Person : NSObject

- (void) buyTicket;

 

// 拥有一个代理属性

// id代表代理的类名随便

// 但必须遵守TicketDelegate协议

@property (nonatomic, retain) id<TicketDelegate> delegate;

@end

Person.m文件

 

Agent.h文件

#import <Foundation/Foundation.h>

#import "TicketDelegate.h"

@interface Agent : NSObject <TicketDelegate>

@end

 

Agent.m文件

#import "Agent.h"

@implementation Agent

 

// 剩余的票数

- (int)leftTicketsNumber

{

    // ... 亲自跑电影院\或者打电话

    

    return 1;

}

 

// 每一张票多少钱

- (double)ticketPrice

{

    // ... 亲自跑电影院\或者打电话

    return 1000;

}

@end

 

main.m文件

#import <Foundation/Foundation.h>

#import "Person.h"

#import "Agent.h"

int main(int argc, const char * argv[])

{

 @autoreleasepool {

        Person *p = [[[Person alloc] init] autorelease];

        

        p.delegate = a;

        

        [p buyTicket];

    }

    return 0;

}

 

void test()

{

    // 人

    Person *p = [[Person alloc] init];

    // 代理

    Agent *a = [[Agent alloc] init];

    

    // 设置人的代理

    p.delegate = a;

    

    // 人打算看电影

    [p buyTicket];

    

    [a release];

    [p release];

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值