黑马程序员———OC学习第六天(block和协议)

本文介绍了iOS和Android开发培训课程的基本概念,包括block和协议的相关知识,详细解释了block和函数的区别,以及如何使用typedef定义block。同时,阐述了协议的作用及应用,通过代理设计模式实现了对象间的交互。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

------- Android培训Java培训IOS培训.NET培训 期待与您交流! ----------

一、block

1、什么是block

block 是OC中特有的一种数据类型,它的作用就是用来保存一段代码,类似于函数

2、block和函数

从写法上来说,block的定义有些类似余指向函数的指针

eg

/******指向函数的指针********/
// 定义函数sum
int sum(int a, int b)
{
     return a + b;
}
// 定义指向函数的指针
int (*p) (int, int);
// 指向函数sum
p = sum;

/******定义一个block*******/
// 定义一个^myBlock
int (^myBlock) (int, int);
// 给block赋值
myBlock = ^(int a, int b){
      return a + b;
};
使用block性能更高

3、用typedef定义block

使用方法如下:

eg

// #typedef的使用
#typedef int (^MyBlock) (int, int)

// 通过MyBlock定义block变量
MyBlock block1 = ^(int a, int b){
           // 返回a*b  
            return a *b;
};

二、protocol(协议)

1、什么是协议

协议是用来声明方法的,一类如果遵守了某个协议,那么它将拥有协议中定义的方法的声明

2、协议的书写格式

@interface 协议名 <NSObject>

@end

其中遵守协议用<>表示

这边还有一个注意点就是,协议什么时候写在一个单独的文件中,什么时候写在类的声明中?

  • 如果某个协议只在这个类使用到了,那么这个协议就声明在类的头文件中
  • 如果这个协议被多个类所使用,那么这个协议就要放到单独的文件中来

3、定义变量时指定协议

NSObject类型的对象,遵守<NSCopying>协议

NSObject<NSCopying> *obje;

任何OC对象遵守<NSCoding>协议

id<NSCoding> obj2;

4、协议的应用(代理设计模式)

代理设计的理念就是有事找代理,比方说一个人要去看电影,如果要使用代理模式设计步骤如下:

  • 首先得有一个代理 id *delegate
  • 在这个人要做的事情中调用代理的方法
  • 将代理要做的事情的声明放到协议中
  • 限制定义代理对象遵守代理协议
eg:
// 定义一个协议
@protocol AgentDelegate <NSObject>
// 声明一个查询剩余票数的方法
- (int)inqueryTicketCount;
// 声明一个查询票价的方法
- (double)inqueryTicketPrice;
@end
// 先定义一个代理类Agent
@interface Agent :NSObject <AgentDelegate>
@end

// 方法实现
@implementation Agent
// 查询票数
- (int)inqrueryticketcount
{
    return 100;
}
// 查询票价
- (double)inqueryTicketPrice
{
    return 500;
}
@end
// 定义一个Person类
@interface Person :NSObject
// 定义一个代理
@property (nonatomic, strong)id<AgentDelegate> delegate;
// 定义一个去看电影的方法
- (bool)seeMovie;
@end

// Person方法的实现
@implementation Person
// 看电影方法
- (bool)isSeeMovie
{
   //  让代理查询票数
    int ticketCount = [_delegate inqueryTicketCount];
  
   // 让代理查询票价
   double ticketPrice = [_delegate inqueryTicketPrice];
   // 判断是否去看电影
   return ticketCount > 0 && ticketPrice < 1000;
}
@end

// int main()
{
   // 定义一个Person对象
  Person *p =[ [Persong alloc] init];
  // 定义一个Agent对象
  Agent *a = [ [Agent alloc] init];
  // 给这个人添加一个代理
  p.delegate = a;
  // 是否去看电影
    if ([ p seeMovie])
   {
        NSLog(@"去看电影");
   }
   else
   {
        NSLog(@"不去看电影");
   }
   return 0;
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值