黑马程序员_OC_block和protocol协议

一.block


基本概念:

 

> Block封装了一段代码,可以在任何时候执行

>  Block可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值。
>   苹果官方建议尽量多用block。在多线程、异步任务、集合遍历、集合排序、动画转场用的很多

一.2.block的定义


int(^MySum)(int,int)= ^(inta,intb){

  returna+b;

};


定义了一个叫MySum的blocks对象,它带有两个int参数,返回int。等式右边就是blocks的具体实现

Block可以访问局部变量,但是不能修改。

intsum=10;

int(^MyBlock)(int)= ^(intnum){

  sum++;//编译报错

  returnnum* sum;

};

如果要修改就要加关键字:__block

__block intsum=10;


一.3.blocks和函数指针的对比


定义函数指针

int(*myFn)();

定义Blocks

int(^MyBlocks)(int,int);


调用函数指针

(*myFn)(10,20);

调用Blocks

MyBlocks(10,20);


一.4.blocks赋值


>  在声明的同时定义变量,然后赋值

int(^MySum)(int,int) = ^(int a,int b) {

  return a + b;

};

也可先用typedef先声明类型,再定义变量进行赋值

typedefint (^MySum)(int,int);

MySumsum = ^(int a,int b) {

  return a + b;

}; 


二.protocol


二.1.protocol简单使用


1. 基本用途

   可以用来声明一大堆方法(不能声明成员变量)

   只要某个类遵守了这个协议,就相当于拥有这个协议中的所有方法声明

   只要父类遵守了某个协议,就相当于子类也遵守了

 

2. 格式

   协议的编写

@protocol 协议名称

// 方法声明列表

@end

   某个类遵守协议

@interface 类名 :父类 <协议名称>

@end

 

3. 关键字

协议中有2个关键字可以控制方法是否要实现(默认是@required),在大多数情况下,用途在于程序员之间的交流

  @required:这个方法必须要实现(若不实现,编译器会发出警告)

  @optional:这个方法不一定要实现

 

4. 协议遵守协议

   一个协议可以遵守其他多个协议,多个协议之间用逗号 , 隔开

   一个协议遵守了其他协议,就相当于拥有了其他协议中的方法声明

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

@end

 

5. 基协议

   NSObject是一个基类,最根本最基本的类,任何其他类最终都要继承它

   其实还有一个协议,名字也叫NSObject,它是一个基协议,最根本最基本的协议

   NSObject协议中声明很多最基本的方法,比如description、retain、release等

   建议每个新的协议都要遵守NSObject协议

 

6. 定义变量时指定协议

// NSObject类型的对象,并且要遵守NSCopying协议

NSObject<NSCopying>*obj;

//任何OC对象,并且要遵守NSCoding协议

id<NSCoding> obj2;

 

二.2.代理设计模式


1.设计原理

   有些麻烦的事情不想自己亲自做,就可以找个人帮忙做,即交给代理对象去做

 

2.设计原则

   首先得拥有某个代理对象属性

   其次要很清楚代理有哪些方法

   最后要保证能解耦


3.实现方案

   定义一个protocol,在其中声明一些和代理沟通的方法

   拥有一个代理属性id<protocol>delegate

   让代理遵守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> 定义在原来类中的分类,只要求能看懂语法



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: tim_oc1init和tim_oc2init是STM32的定时器模块中的函数,用于初始化定时器的输出比较通道1和通道2。其中,tim_oc1init用于初始化通道1,tim_oc2init用于初始化通道2。这两个函数可以设置定时器的输出模式、极性、预分频器等参数,以满足不同的应用需求。 ### 回答2: tim_oc1init和tim_oc2init是两个函数,是在STM32开发中使用的定时器输出比较功能函数。 首先,我们需要了解一下定时器和定时器输出比较的概念。定时器是一种可编程、周期性的计时器,它能够在一定时间内产生定时中断或输出PWM信号。而定时器输出比较是指定时器对比较值进行比较,当定时器计数器计数值达到比较值时,定时器输出会发生变化。 tim_oc1init和tim_oc2init是用于设定定时器输出比较功能的函数,以tim_oc1init函数为例,它的具体功能包括: 1. 设定TIMx_CH1的输出模式和极性,可以选择PWM模式或脉冲模式,并可设定输出极性为正常或反转; 2. 设定比较值,即当计数器的值达到此值时触发输出; 3. 设定预分频系数和重载值,确定计时器的计数范围。 通过tim_oc1init和tim_oc2init函数的设定,可以实现定时器输出比较功能,可以控制各种电子设备的输出信号和开关控制,适用于各种行业的应用场景。在开发中,根据具体需求使用不同的输出模式和比较值,可以实现多种不同的功能操作。 ### 回答3: tim_oc1init和tim_oc2init是针对定时器的两个初始化函数。 首先,定时器是嵌入式系统中非常重要的一个模块,它可以通过计时和计数等方式实现各种定时和计时功能,比如控制LED灯闪烁、通过定时触发中断来完成一些任务等。 而tim_oc1init和tim_oc2init则是针对定时器的输出比较功能而设置的两个初始化函数,用于配置定时器的输出比较通道1和通道2。 对于tim_oc1init而言,它可以设置如下几个参数:定时器的指针、比较输出模式、预分频系数、占空比等。其中,比较输出模式有四种模式可供选择,分别为TIM_OCMode_Timing(定时模式)、TIM_OCMode_Active(有效电平模式)、TIM_OCMode_Inactive(无效电平模式)和TIM_OCMode_PWM1(脉冲宽度调制模式)。 而tim_oc2init则是针对定时器的输出比较通道2进行初始化,可以设置的参数与tim_oc1init相同,只不过它是控制通道2的输出状态。 需要注意的是,这两个函数都是基于STM32的定时器模块设计的,因此在使用它们时需要根据硬件平台来确定具体的实现方法和参数设置。 总的来说,tim_oc1init和tim_oc2init是非常重要的定时器初始化函数,可以方便地控制定时器的输出比较通道,从而实现各种自定义的功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值