oc回调的几种方式

本文介绍了Objective-C中的四种回调机制:Target-action回调、delegate方式、Notifications方式及block方式,并详细阐述了每种方式的使用场景与实现原理。

oc回调的几种方式

春招也在找到实习后结束了,实习时候由于组内缺人,也被调整到了ios组,也是开始了ios的学习,虽然开始学习一门新的技术是困难的,而且还是从Java转到了oc语言,但是人生本来就是一个不断学习的过程,不是吗?

这里总结一下oc语言中的回调机制。类似于Android中的interface callback回调的方式,oc中也有几种实现回调的方式,但是总的来说,实现都是我们会通过某种途径,将一段代码和一个特定的事件联系起来,当特定事件发生后,这段代码才会被执行。

这里主要介绍一下oc中的4种回调

  • Target-action回调
  • delegate方式
  • Notifications 方式
  • block方式

Target-action回调

 [button addTarget:self action:@selector(onClick:)
 forControlEvents:UIControlEventTouchUpInside];

这里我们传入了onclick方法,但是onclick方法并不会立即执行,他会在具体的click事件执行过后,才会执行onclick方法,完成了回调

delegate方式

delegate 在oc中是类似于 Android中的interface的作用,首先定义一个delegate,通过外部设置delegate,外部方法传入了delegate方法后,并不会立即执行,而是当前的事件触发过后才会执行

#import < Foundation/Foundation.h >

@protocol MyDelegate <NSObject>


@optional

- (void)doSomeThing();   //定义delegate中的方法
@end

@interface MyDelegateManager : NSObject

@property (weak) id<MyDelegate> delegate;     //软引用持有delegate方法,防止相互引用
@end
import "MyDelegateManager.h"

@interface MyDelegateManager ()

@end

@implementation MyDelegateManager
-(void)dothing(){
    if(delegate){
        [self.delegate doSomeThing];        //这里执行delegate回调
    }
}
@end
#import "ViewController.h"
#import "MyCnetralManager.h"

@interface ViewController ()


@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    MyDelegateManager *manager = [[MyDelegateManager alloc] init];   
    manager.delegate = self;     //将delegate设置为自身
}


- (void)doSomething() {   //这里实接口的具体实现,当调用后会执行自身的逻辑      
  //dosomething
}
@end

Notifications方式

oc中提供了Notifications方式为我们发送通知的方式,类似于Android中的广播,同样也是用到了观察者模式,首先我们需要注册一个notifacation,然后其就会接受来自外部的信息,当接受到信息后,就会执行相应的方法。

/*
第一个参数指需要注册的对象
第二个参数指需要执行的方法
第三个是需要相应的名称
第四个是接受谁发出的通告,nil表示都接受
*/
[[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(doSomething:)
                                                 name:kNotification
                                               object:nil];
/*
第一个参数指需要发送至的对象
第二个参数指发送的对象
第三个参数是指需要发送的额外信息
*/
[[NSNotificationCenter defaultCenter] postNotificationName:kNotification
                                                            object:nil
                                                          userInfo:nil];

block方式

block是一种类似Java中匿名内部类的形式,在上面的notifacation中,我们可以直接通过block来实现

[[NSNotificationCenter defaultCenter] addObserverForName:kNotification
                                                      object:nil
                                                       queue:nil
                                                  usingBlock:^(NSNotification * _Nonnull note) {
        //doSomething

    }];

同样我们也可以block当做一个接口来实现回调。

### STM32 HAL 库中定时器回调函数的相关说明 #### 1. `HAL_TIM_IC_CaptureCallback` 的功能 `HAL_TIM_IC_CaptureCallback` 是 STM32 HAL 库中用于处理定时器输入捕获事件的回调函数。当配置了定时器以捕获模式运行时,每次发生输入捕获事件(即定时器捕获到一个信号的边沿),该回调函数会被调用[^1]。 #### 2. 替代或相关函数 在 STM32 HAL 库中,与 `HAL_TIM_IC_CaptureCallback` 相关或可以替代的函数包括以下几种: - **`HAL_TIM_PeriodElapsedCallback`**:此函数用于处理定时器周期中断事件。当定时器计数值达到自动重装载值时,会触发此回调函数。它适用于需要定期执行任务的场景[^2]。 - **`HAL_TIM_OC_DelayElapsedCallback`**:此函数用于处理输出比较模式下的延迟到期事件。当定时器的输出比较通道达到设定值时,会触发此回调函数。它通常用于生成精确的脉冲信号[^3]。 - **`HAL_TIM_TriggerCallback`**:此函数用于处理外部触发事件。当定时器接收到外部触发信号时,会触发此回调函数。它适用于需要同步多个定时器或外设的场景[^4]。 - **`HAL_TIM_ErrorCallback`**:此函数用于处理定时器错误事件。当定时器发生错误(如溢出、非法操作等)时,会触发此回调函数。它有助于提高系统的鲁棒性[^5]。 #### 3. 示例代码 以下是一个使用 `HAL_TIM_IC_CaptureCallback` 和其他相关回调函数的示例代码: ```c #include "stm32f1xx_hal.h" TIM_HandleTypeDef htim2; void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) { if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1) { uint32_t capturedValue = __HAL_TIM_GET_CAPTURE1(htim); // 打印捕获值或其他操作 printf("Captured Value: %lu\r\n", capturedValue); } } void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if (htim->Instance == TIM2) { // 定时器周期中断处理逻辑 printf("Period Elapsed Callback Triggered\r\n"); } } void HAL_TIM_ErrorCallback(TIM_HandleTypeDef *htim) { if (htim->Instance == TIM2) { // 错误处理逻辑 printf("Error Occurred in TIM2\r\n"); } } void TIM2_InputCapture_Init(void) { TIM_IC_InitTypeDef sConfigIC = {0}; htim2.Instance = TIM2; htim2.Init.Prescaler = 0; htim2.Init.CounterMode = TIM_COUNTERMODE_UP; htim2.Init.Period = 65535; htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; HAL_TIM_IC_Init(&htim2); sConfigIC.ICPolarity = TIM_INPUTCHANNELPOLARITY_RISING; sConfigIC.ICSelection = TIM_ICSELECTION_DIRECTTI; sConfigIC.ICPrescaler = TIM_ICPSC_DIV1; sConfigIC.ICFilter = 0; HAL_TIM_IC_ConfigChannel(&htim2, &sConfigIC, TIM_CHANNEL_1); HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_1); } ``` #### 4. 关键点解析 - **定时器初始化**:通过 `HAL_TIM_IC_Init` 函数初始化定时器为输入捕获模式。 - **通道配置**:使用 `HAL_TIM_IC_ConfigChannel` 配置捕获通道的极性、滤波器等参数。 - **中断使能**:通过 `HAL_TIM_IC_Start_IT` 启用输入捕获中断。 - **捕获值获取**:在回调函数中,使用 `__HAL_TIM_GET_CAPTURE1` 获取捕获的值[^1]。 #### 5. 注意事项 - 确保定时器时钟已正确配置,并且输入信号连接到指定的捕获通道引脚。 - 如果需要处理多个通道的捕获事件,可以在回调函数中通过 `htim->Channel` 判断具体是哪个通道触发了事件[^1]。 --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值