blocks实现两个类之间通信

iOS Block按钮与视图控制器
本文介绍如何在iOS开发中使用Block实现按钮点击事件及视图控制器间的回调交互,并探讨Block的内存管理机制。

/*

     block引用局部变量,会把该变量作为常量编码到block块中,所以不能修改需要有__block修饰才可以

      __block n = 5;

     block内引用局部的Objective-C对象的时候,该对象会被retain,如果局部变量使用__block修饰,则不会被retain

     block里面使用一个对象里面的变量(属性)时,该对象会被retain

     block本身可以像对象一样copyrelease

     block创建后内存在栈上(编译器管理内存),调用copy后会移到堆上(手动管理)

     block声明为全局变量时,我用需要调用blockcopy方法

     */


先看一个自定义button,点击事件用回调实现

BlockBtn.h

#import <UIKit/UIKit.h>

// 定义block

typedefvoid(^BlockTap)(UIButton *);


@interface BlockBtn :UIButton

// copy属性,把block移到堆上

@property(nonatomic,copy)BlockTap blockTap;


@end

//----------

BlockBtn.m

#import "BlockBtn.h"

@implementation BlockBtn

- (void)dealloc

{

    // 释放block

    Block_release(_blockTap);

    [superdealloc];

}

- (instancetype)init

{

   self = [superinit];

   if (self) {

        // 给自己添加点击事件

        [selfaddTarget:selfaction:@selector(click:)forControlEvents:UIControlEventTouchUpInside];

    }

    return self;

}

- (void)click:(UIButton *)btn

{

    _blockTap(self);

}

下面的类中会使用这个Btn的回调

- (void)viewDidLoad {

    [superviewDidLoad];

   //self.view.translatesAutoresizingMaskIntoConstraints = NO;

    BlockBtn *btn = [[BlockBtnalloc] init];

    btn.frame = CGRectMake(0.0,0.0, 100, 100);

    //btn.translatesAutoresizingMaskIntoConstraints = NO;

    [btn setTitle:@"点击"forState:UIControlStateNormal];

    btn.backgroundColor = [UIColorredColor];

    [self.viewaddSubview:btn];

    [btn release];

//    [self.view addConstraint:[NSLayoutConstraint constraintWithItem:btn attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeLeft multiplier:1 constant:30.0]];

//    [self.view addConstraint:[NSLayoutConstraint constraintWithItem:btn attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeTop multiplier:1 constant:80.0]];

//    [self.view addConstraint:[NSLayoutConstraint constraintWithItem:btn attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:0 constant:60.0]];

//    [self.view addConstraint:[NSLayoutConstraint constraintWithItem:btn attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:0 constant:90.0]];

    __blockViewController *vc = self;

    btn.blockTap = ^(UIButton *btn) { //btn的回调推出下一视图

        NSLog(@"one show");

        JJOneViewController *one = [[[JJOneViewControlleralloc] init] autorelease];

        [vc presentViewController:oneanimated:YEScompletion:^{}];

        one.oneBlock = ^() { //JJOneViewController消失后改变背景色

            vc.view.backgroundColor = [UIColorpurpleColor];

        };

    };

}

JJOneViewController.h

#import <UIKit/UIKit.h>

typedefvoid(^OneBlock)(void);

@interface JJOneViewController :UIViewController

@property(nonatomic,copy)OneBlock oneBlock;

@end

JJOneViewController.m

- (void)dealloc

{

    NSLog(@"JJOneViewController释放了");

    Block_release(_oneBlock);

    [superdealloc];

}

- (void)viewDidLoad {

    [superviewDidLoad];

    self.view.backgroundColor = [UIColorgrayColor];    

//    BlockBtn *btn = [[BlockBtn alloc] init];

//    btn.frame = CGRectMake(10.0, 90.0, 70, 100);

//    btn.backgroundColor = [UIColor greenColor];

//    [self.view addSubview:btn];

//    [btn release];

//    __block JJOneViewController *one = self;

//    btn.blockTap = ^(UIButton *btn) {

//        [one dismissViewControllerAnimated:YES completion:^{

//            _oneBlock();

//        }];

//    };

   UIButton *btn = [[UIButtonalloc] init];

    btn.frame =CGRectMake(10.0,90.0, 70, 100);

    btn.backgroundColor = [UIColorgreenColor];

    [self.viewaddSubview:btn];

    [btnrelease];

    [btn addTarget:selfaction:@selector(click:)forControlEvents:UIControlEventTouchUpInside];

}

- (void)click:(UIButton *)btn

{

    [selfdismissViewControllerAnimated:YEScompletion:^{

       _oneBlock();

    }];

}



个人研究成果,wxWidgets的外围通讯库基本一直处于空缺状态,经过几天的研究,将我个人的研究成果上传共享。 本库基于官方于2011年最后一次更新的libctb-0.16版本为基础修改而来,工程使用CodeBlocks创建,相较原版的变更如下。 1.去掉了ctb命名空间,之前用起来感觉有点别扭,所以去掉了,不过为了兼容性考虑,以后可能加回来。 2.IOBase、SerialPort(继承自IOBase)、GPIB(继承自IOBase)三个修改了构造函数,原来FIFO缓冲的尺寸固定为256,我觉得波特率高时候可能不够用,现在改为通过构造函数传参由用户指定,示例程序中使用4096。 3.修正一个严重的BUG,在SerialPort基中的OpenDedvice方法中,当串口附加参数为NULL时,内的附加参数结构体成员将在没有被始化就被使用,进而因参数混乱而导致收发异常,这个BUG目前我已将其修复并进行了测试。 4.对Win32环境下的GetAvailablePorts函数进行重写,现在可以获取串口号超过20的串口(原来的最多到Com20),并且可以得到串口的设备名信息。 5.以上修改只在Windows下测试通过,我手头没有Linux环境,对Linux相关的代码基本是靠着意念盲改,如果您发现了有错误疏漏,欢迎指正,能帮我改改就更好了,比如Linux下如何取得串口设备名我就还没弄明白。 压缩包里有可以编译静态库的工程,以及一个基于wxWidgets3.1的演示工程,就是一个简单的串口收发器,供大家参考。 由于串口功能的实现需要依赖Windows系统API,在Windows下,如果使用Mingw编译,请改你连·请关联静态库libsetupapi.a与libwinmm.a
要使用GNU Radio实现LoRa通信,以下是一个基本的示例步骤和代码示例。 ### 环境准备 首先要确保已经安装了GNU Radio和相关的依赖库。在Ubuntu系统中,可以使用以下命令安装: ```bash sudo apt-get install gnuradio gnuradio-dev gr-osmosdr ``` ### 实现LoRa发射端实例 下面是一个简单的GNU Radio Python脚本示例,用于实现LoRa信号的发射: ```python from gnuradio import gr from gnuradio import analog from gnuradio import blocks from gnuradio import digital from gnuradio import filter from gnuradio.filter import firdes import osmosdr import time class lora_tx(gr.top_block): def __init__(self): gr.top_block.__init__(self) # 配置参数 samp_rate = 500000 center_freq = 868e6 sf = 7 bw = 125000 payload_length = 12 # 信号源 src = analog.random_uniform_source_b(0, 255) # 打包 pack = blocks.pack_k_bits_bb(8) # LoRa调制器 lora_mod = digital.lora_mod(sf, bw, samp_rate, payload_length) # 射频前端 osmo_sink = osmosdr.sink(args="numchan=1 " + "hackrf") osmo_sink.set_sample_rate(samp_rate) osmo_sink.set_center_freq(center_freq, 0) osmo_sink.set_gain(30, 0) # 连接模块 self.connect(src, pack, lora_mod, osmo_sink) if __name__ == '__main__': try: tb = lora_tx() tb.start() time.sleep(10) tb.stop() tb.wait() except KeyboardInterrupt: pass ``` ### 实现LoRa接收端实例 以下是一个简单的GNU Radio Python脚本示例,用于实现LoRa信号的接收: ```python from gnuradio import gr from gnuradio import analog from gnuradio import blocks from gnuradio import digital from gnuradio import filter from gnuradio.filter import firdes import osmosdr class lora_rx(gr.top_block): def __init__(self): gr.top_block.__init__(self) # 配置参数 samp_rate = 500000 center_freq = 868e6 sf = 7 bw = 125000 # 射频前端 osmo_source = osmosdr.source(args="numchan=1 " + "hackrf") osmo_source.set_sample_rate(samp_rate) osmo_source.set_center_freq(center_freq, 0) osmo_source.set_gain(30, 0) # LoRa解调器 lora_demod = digital.lora_demod(sf, bw, samp_rate) # 解包 unpack = blocks.unpack_k_bits_bb(8) # 数据接收器 sink = blocks.null_sink(gr.sizeof_char) # 连接模块 self.connect(osmo_source, lora_demod, unpack, sink) if __name__ == '__main__': try: tb = lora_rx() tb.start() tb.wait() except KeyboardInterrupt: pass ``` ### 代码解释 - **发射端**:先产生随机数据,接着进行打包处理,再利用LoRa调制器将数据调制为LoRa信号,最后通过射频前端发射出去。 - **接收端**:通过射频前端接收信号,使用LoRa解调器对信号进行解调,然后解包处理,最终将数据输送到空接收器。 ### 运行代码 将上述代码保存为两个Python文件(例如`lora_tx.py`和`lora_rx.py`),然后在终端中分别运行: ```bash python lora_tx.py python lora_rx.py ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值