[TwistedFate]iOS多线程编程GCD

iOS BLE蓝牙开发数据传输协议详解 常用算法(AES加密 HMAC_hash PRF) 前言 这段时间参与了一款与蓝牙外设交互的项目, 以前没有涉及过数据传输方面的开发, 踩了不少坑, 同时也学到了很多东西. 此时, 项目也即将进入尾声, 有时间把这些记录一二. 本人才疏学浅, 如有错误,大佬轻喷. BLE4.0开发 这方面网上的Demo一大堆, 暂时不做太多的赘述, 只对坑点做一个摘要. 需求使然, 要对设备的接近远离有一个比较精确的计算, 使用的方案是对蓝牙的信号强度进行分析.... 阅读详情

多线程

  • 进程:正在活动(运行的)一个应用程序,就是一个进程
  • 每一个进程 都至少有一个线程 (主线程)
  • 线程:每一个线程都是独立的,可以执行任务
  • 除了主线程以外的 都叫子线程
  • 子线程可以有 很多个 但是线程是耗费资源的
  • (一般最多不超过五条 注:三条最佳)
  • 主线程操作什么样的任务?
    (UI界面 按钮的点击 屏幕滚动 一切用户看的见的 都要在主线程当中操作)
  • 子线程也操作UI界面 会造成什么问题?
    (听主线程 还是子线程)
  • 程序退出后会清空线程的任务

  • 主线程 下载20G电影 (耗时)
    屏幕就会假死 卡住 下完才恢复

  • 比较大的耗时操作 又或者 用户看不到的操作 可以放到子线程当中去做 比如下载 解压缩 读取大型数据等可以在子线程当中进行操作
  • 多线程的原理:
    CPU在工作时,同一时间只能执行一个任务,
    之所以可以造成多条线程一起执行任务的假象,是因为CPU在进行高速的线程切换(调度),来达到多个任务一起执行的效果
  • 多线程的优点:
    1.可以大大提高执行任务的效率
    2.可以让用户 有更好的用户体验
    缺点:
    如果大量的开辟线程 会造成程序的卡顿 耗费过量的资源
    物极必反

简介

iOS有三种多线程编程的技术,分别是:
(一)NSThread
(二)Cocoa NSOperation
(三)GCD(全称:Grand Central Dispatch)
这三种编程方式从上到下,抽象度层次是从低到高的,抽象度越高的使用越简单,也是Apple最推荐使用的。

三种方式的优缺点介绍:

1)NSThread:
优点:NSThread 比其他两个轻量级
缺点:需要自己管理线程的生命周期,线程同步。线程同步对数据的加锁会有一定的系统开销
Cocoa NSOperation
优点:不需要关心线程管理,数据同步的事情,可以把精力放在自己需要执行的操作上。

2) Cocoa operation 相关的类是 NSOperation ,NSOperationQueue。
NSOperation是个抽象类,使用它必须用它的子类,可以实现它或者使用它定义好的两个子类:NSInvocationOperation 和 NSBlockOperation。
创建NSOperation子类的对象,把对象添加到NSOperationQueue队列里执行。

3) GCD
Grand Central Dispatch (GCD)是Apple开发的一个多核编程的解决方法。在iOS4.0开始之后才能使用。GCD是一个替代诸如NSThread, NSOperationQueue, NSInvocationOperation等技术的很高效和强大的技术。现在的iOS系统都升级到7了,所以不用担心该技术不能使用。

介绍完这三种多线程编程方式,本文将依次介绍这三种技术的使用。

NSThread的使用

初始化线程
//  1.初始化 开辟一个子线程
//    NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(download:) object:@"123"];
//    [thread start];

 //  2.开辟一个子线程 不用开始自动执行
    [NSThread detachNewThreadSelector:@selector(download:) toTarget:self withObject:@"123"];

selector :线程执行的方法,这个selector只能有一个参数,而且不能有返回值。
target :selector消息发送的对象
argument:传输给target的唯一参数,也可以是nil

第二种方式会直接创建线程并且开始运行线程,第一种方式是先创建线程对象,然后再运行线程操作,在运行线程操作前可以设置线程的优先级等线程信息

线程 休眠(延迟执行的效果)
    [NSThread sleepForTimeInterval:5];
获得当前线程以及判断是否主线程
//  当前线程
    NSLog(@"--------%@",[NSThread currentThread]);
//  判断当前线程 是否是主线程
    NSLog(@"%d",[NSThread isMainThread]);
结束当前线程
 [NSThread exit];
// 相当于 在这儿 return  只要退出当前的线程 后边的方法 一切方法都不执行了

Cocoa NSOperation的使用

使用NSOperation的方式有两种
一种是用定义好的两个子类:NSInvocationOperation 和 NSBlockOperation。
另一种是继承NSOperation

NSInvocationOperation的使用
 //  需要把NSInvocationOperation对象 放进一个队列里 才能完成开启子线程

    //  创建一个队列
    NSOperationQueue *queue = [[NSOperationQueue alloc] init];

    //  给队列 设置 最大并发数
    queue.maxConcurrentOperationCount = 1;

    //  开启一个线程(相当于 一个任务)
    NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(download:) object:@"12"];

    //  把任务添加到 队列中
    //  只需要把任务添加进队列中 不需要咱们来操作
    //  会自动执行 不是添加一个任务就开启一个线程
    //  这个操作是系统给的  有的线程 会被系统重复利用(优化)
    [queue addOperation:operation];

GCD

  • 全称Grand Central Dispatch
  • GCD的工作原理是:让程序平行排队的特定任务,根据可用的处理资源,安排他们在任何可用的处理器核心上执行任务。
  • GCD中的FIFO队列称为dispatch queue,它可以保证先进来的任务先得到执行。
    dispatch queue分为下面三种:
Serial

又称为private dispatch queues,同时只执行一个任务。Serial queue通常用于同步访问特定的资源或数据。当你创建多个Serial queue时,虽然它们各自是同步执行的,但Serial queue与Serial queue之间是并发执行的。

Concurrent

又称为global dispatch queue,可以并发地执行多个任务,但是执行完成的顺序是随机的。

Main dispatch queue

它是全局可用的serial queue,它是在应用程序主线程上执行任务的。

常用的方法dispatch_async

GCD会自动根据任务在多核处理器上分配资源,优化程序。
系统给每一个应用程序提供了三个concurrent dispatch queues。这三个并发调度队列是全局的,它们只有优先级的不同。因为是全局的,我们不需要去创建。我们只需要通过使用函数dispath_get_global_queue去得到队列

//  获取全局队列
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{   
    // 耗时的操作   
    dispatch_async(dispatch_get_main_queue(), ^{   
        // 更新界面   
    });   
});


dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

    dispatch_async(queue, ^{

        //  做请求的 耗时操作(同步请求)
        //  在子线程中 同步请求 就相当于异步请求
        NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://image.dianping.com/Groups/GroupPic/2007-04-11/www123_1538656_88829_L.jpg"]];

        UIImage *image = [UIImage imageWithData:data];


        //  回到主线程刷新界面
        //  取出主线程
        // dispatch_get_main_queue();
        dispatch_async(dispatch_get_main_queue(), ^{

            //  回到主线程要执行的任务 刷新UI
            UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(100, 100, 200, 200)];

            imageView.image = image;
            [self.view addSubview:imageView];
            [imageView release];

        });
    });


dispatch_group_async的使用

dispatch_group_async可以实现监听一组任务是否完成,完成后得到通知执行其他的操作。这个方法很有用,比如你执行三个下载任务,当三个任务都下载完成后你才通知界面说完成

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);   
dispatch_group_t group = dispatch_group_create();   
dispatch_group_async(group, queue, ^{   
    [NSThread sleepForTimeInterval:1];   
    NSLog(@"group1");   
});   
dispatch_group_async(group, queue, ^{   
    [NSThread sleepForTimeInterval:2];   
    NSLog(@"group2");   
});   
dispatch_group_async(group, queue, ^{   
    [NSThread sleepForTimeInterval:3];   
    NSLog(@"group3");   
});   
dispatch_group_notify(group, dispatch_get_main_queue(), ^{   
    NSLog(@"updateUi");   
});   
dispatch_release(group);
dispatch_barrier_async的使用

dispatch_barrier_async是在前面的任务执行结束后它才执行,而且它后面的任务等它执行完成之后才会执行

dispatch_queue_t queue = dispatch_queue_create("gcdtest.rongfzh.yc", DISPATCH_QUEUE_CONCURRENT);   
dispatch_async(queue, ^{   
    [NSThread sleepForTimeInterval:2];   
    NSLog(@"dispatch_async1");   
});   
dispatch_async(queue, ^{   
    [NSThread sleepForTimeInterval:4];   
    NSLog(@"dispatch_async2");   
});   
dispatch_barrier_async(queue, ^{   
    NSLog(@"dispatch_barrier_async");   
    [NSThread sleepForTimeInterval:4];   

});   
dispatch_async(queue, ^{   
    [NSThread sleepForTimeInterval:1];   
    NSLog(@"dispatch_async3");   
});
dispatch_apply
dispatch_apply(5, globalQ, ^(size_t index) { 
    // 执行5次 
});
政府科技管理者如何提升科技成果转化项目进场交易的备案效率?.docx 政府科技管理者如何提升科技成果转化项目进场交易的备案效率? 立即下载

相关推荐

山区道路边坡落石隐患检测数据集VOC+YOLO格式241张1类别.md

【重要提示】本页面仅为资源介绍,不含外部下载地址 亲爱的 优快云 用户: 感谢你浏览本资源页面,在这里提前向大家说明相关情况,避免后续产生误解。本资源我设置的初衷是 0 积分免费分享文档介绍,希望可以无偿给到有需要的朋友。但 优快云 平台存在自动调控机制,系统会根据资源下载热度、文件体积、平台规则等因素,自动修改资源所需下载积分,页面显示为 1 积分、2 积分或更高积分都属于平台自动调整结果,并非我手动修改设置,我没有权限自主锁定积分数值。 如果你打开页面后,发现下载所需积分不为 0,请务必谨慎考虑是否下载。一旦你支付积分完成下载,后续遇到资源内容和描述不符、文件损坏等问题,我无法承担对应的积分损失,也没有渠道为你办理积分退还。在此强烈建议,只有页面明确显示 0 积分的时候,再进行下载操作。 同时特别说明:这份资源介绍文案里,没有附带任何外部下载地址。资源本身是通过 优快云 官方上传通道上传的附件,正常情况下直接点击页面自带的下载按钮即可获取文件。页面找不到外部下载链接属于正常情况,并非资源缺失。 如果因为平台积分显示异常,导致你被扣取积分,积分退款、积分异常相关问题,请直接联系 优快云 官方客服咨询处理。平台规则由官方制定,我无法干预积分变动,望各位理解。

OC中随机数的使用(3种):arc4random,random,CCRANDOM_0_1()

1、随机数的使用      1)、arc4random() 比较精确不需要生成随即种子        使用方法 :                  通过arc4random() 获取0到x-1之间的整数的代码如下:                 int value = arc4random() % x;                  获取1到x之间的整数的

Do not just be a pragrammer 1424

高空作业栏杆检测数据集VOC+YOLO格式230张3类别.md

【重要提示】本页面仅为资源介绍,不含外部下载地址 亲爱的 优快云 用户: 感谢你浏览本资源页面,在这里提前向大家说明相关情况,避免后续产生误解。本资源我设置的初衷是 0 积分免费分享文档介绍,希望可以无偿给到有需要的朋友。但 优快云 平台存在自动调控机制,系统会根据资源下载热度、文件体积、平台规则等因素,自动修改资源所需下载积分,页面显示为 1 积分、2 积分或更高积分都属于平台自动调整结果,并非我手动修改设置,我没有权限自主锁定积分数值。 如果你打开页面后,发现下载所需积分不为 0,请务必谨慎考虑是否下载。一旦你支付积分完成下载,后续遇到资源内容和描述不符、文件损坏等问题,我无法承担对应的积分损失,也没有渠道为你办理积分退还。在此强烈建议,只有页面明确显示 0 积分的时候,再进行下载操作。 同时特别说明:这份资源介绍文案里,没有附带任何外部下载地址。资源本身是通过 优快云 官方上传通道上传的附件,正常情况下直接点击页面自带的下载按钮即可获取文件。页面找不到外部下载链接属于正常情况,并非资源缺失。 如果因为平台积分显示异常,导致你被扣取积分,积分退款、积分异常相关问题,请直接联系 优快云 官方客服咨询处理。平台规则由官方制定,我无法干预积分变动,望各位理解。

[TwistedFate]面向对象编程、类和对象、实例变量操作

1.Objective-C简称OC,扩充⾃C语⾔的⾯向对象编程语⾔。 是OS X和iOS操作系统的主要编程语⾔ 2.OC的输出方法NSLog,比C语言的printf多一个换行 3.@符 是OC关键字的标志 C语言基本数据类型 int float char OC常用基本数据类型 NSInteger 整型 CGFloat 浮点型 NSString

Do not just be a pragrammer 738

ti-cgt-c2000-22.6.0.LTS-windows-x64-installer

ti-cgt-c2000-22.6.0.LTS-windows-x64-installer

深入AOSP构建系统:从BUILD_FINGERPRINT的生成逻辑,看如何定制你的Android设备标识

本文深入解析AOSP构建系统中的设备指纹生成机制,详细介绍了BUILD_FINGERPRINT的生成逻辑及其在Android设备中的关键作用。通过分析多个指纹属性的区别与联系,以及如何定制设备标识,帮助开发者更好地理解和掌握Android系统构建过程。

weixin_27017211的博客 221

objc4源码编译与调试

源码下载 在Apple Open Source上选择对应自己的macOS版本下,下载objc4即可。 笔者是macOS Catalina 10.15.6,所以选择的是objc4-787.1版本,顺便在该页面中下载Libc,dyld,libauto,libclosure,libdispatch,libpthread,xnu,libplatform这几个依赖库,编译objc4的时候需要用到。 解决编译错误 下载完成,解压之后我们打开工程文件,运行报错unable to find sdk 'macosx.

Do not just be a pragrammer 666

USB-C快充协议分析仪:QC/PD双协议识别与功率监测设计

USB-C快充协议是现代移动设备能量传输的核心技术标准,其本质是通过物理层电压特征(如DP/DM组合、CC线BMC编码)实现动态电压协商。理解协议握手原理对充电器研发、兼容性测试及故障诊断至关重要。本方案聚焦受电端(Sink)视角,基于FUSB302B与高阻抗DP/DM采样电路,实现QC2.0/QC3.0/QC4+与PD2.0/PD3.0的实时识别与状态机解析;结合INA219高精度电流检测与μs级同步采样,达成±0.06%功率测量精度。典型应用于快充芯片验证、产线协议一致性测试及第三方评测,为USB供电系

weixin_42153793的博客 245

[TwistedFate]Block 字面量

Block ^托字符(凸起符) Block保存的是 有特定功能的函数体 int (^Block)(int a, int b) = ^初值(跟前面类型要一致) block重命名typedef <#returnType#>(^<#name#>)(<#arguments#>); int (^Block)(int a, int b) = ^int (int a, int b){

Do not just be a pragrammer 596

MAIXCAM无线连接实战:5分钟搞定远程调试与代码烧录(避坑版)

本文提供了一份详细的MAIXCAM无线连接实战指南,帮助嵌入式视觉开发者快速配置远程调试与代码烧录。文章重点介绍了通过MaixHub IDE进行Wi-Fi配置、建立远程终端连接、使用SFTP进行文件传输以及管理自启动应用程序的完整流程,并针对IP地址变动、信号中断等常见问题提供了实用的避坑解决方案,旨在提升开发效率与灵活性。

weixin_29188043的博客 299

Python实战:5分钟搞定VCF文件中每个样本的SNP统计(附bcftools安装指南)

本文介绍了三种高效统计VCF文件中每个样本SNP数量的Python方法,包括原生解析、结合bcftools的推荐方案以及使用PyVCF3专业库。特别推荐bcftools结合Python的方法,适用于中大型VCF文件,显著提升处理效率。文章还提供了bcftools安装指南和进阶统计技巧,帮助生物信息学分析人员快速完成SNP统计任务。

weixin_30555125的博客 494

[TwistedFate] NSDictionary NSSet

1.NSDictionary不可变字典类 字典 是一个容器 跟数组一样 可以保存数据 保存的形式 是以键值对的形式 一个key对应一个value key 和 value 必须是对象 key作为钥匙 要具有唯一性 在开发中 一半使用字符串作为key值 value可以是一个很复杂的结构 例如字典里嵌套一个字典 字典里保存的键值对是无序的不可变字典切记不能进行增删操作// 用两个数组来初始化

Do not just be a pragrammer 533

嵌入式存储进阶:除了KV存储,EasyFlash的IAP和LOG功能怎么玩?

本文深入探讨了嵌入式存储方案EasyFlash的高级功能,包括在线固件升级(IAP)和闪存日志存储(LOG)。通过详细解析IAP的双区备份设计和LOG的环形缓冲区架构,提供硬件适配、安全升级流程和日志管理技巧等实战指南,帮助开发者在物联网设备中实现可靠的数据存储和固件更新。

weixin_29280219的博客 414

iOS触摸事件理解

## 如何确定由哪个视图响应触摸事件 解决这个问题之前,我们先看下几个与之相关的类。 ### UITouch 触摸,UITouch保存着跟手指相关的信息,比如触摸的位置、时间、阶段等。 1. 当手指移动时,系统会更新同一个UITouch对象,使之能够一直保存该手指在的触摸位置。 当手指离开屏幕时,系统会销毁相应的UITouch对象。 2. 一个手指触摸一次屏幕就会生产一个UITouch对象,多个手指同时触摸屏幕,就会生成多个UITouch对象。 3. 单个手指多次触摸屏幕(类似于双击等操作...

Do not just be a pragrammer 521

SuperMap iObjects Java组件开发——环境部署(IntelliJ IDEA)

SuperMap iObjects Java 是面向GIS应用系统开发者的组件式GIS开发平台,具有强大的地理数据管理、编辑、显示、分析等功能,并且其具有极强的易用性和丰富的帮助资源,适宜快速开发大型GIS应用系统。本文将介绍如何在IntelliJ IDEA集成开发环境中进行SuperMap iObjects Java组件的环境部署。

nan620403的博客 1081

1020空心杯电机驱动设计与ESP32实战

空心杯电机是一种高动态响应的直流微特电机,其驱动本质是解决电感负载下的大di/dt启动、反电动势耦合与电流纹波抑制问题。核心原理在于建立包含内阻、电感和反电动势的等效电路模型,并据此匹配开关器件、PWM参数与采样闭环。技术价值体现在小体积下实现毫秒级响应、低噪声(>30kHz)、高精度电流保护(±50mA)及热鲁棒性。典型应用于微型航模、手持云台与精密执行器等对功率密度和动态性能敏感的嵌入式系统。本文以1020规格空心杯电机为对象,基于ESP32平台完成从MOSFET选型、32kHz硬件PWM生成到INA2

weixin_42298164的博客 589

LLDB调试增强插件Chisel安装与使用教程

chisel是一款facebook出品的LLDB调试器增强插件,添加了诸如pviews,show,hide等命令,详细可以查看chisel wiki 安装 我们可以使用Homebrew来安装chisel,没有安装Homebrew的同学请戳Homebrew安装 已经安装了Homebrew可以直接使用下面的命令安装chisel brew install chisel 执行命令结果如上图表示已经完成...

Do not just be a pragrammer 505

大模型——Coze工作流实战:一键生成像素风格视频

本文介绍了如何利用Coze平台工作流生成像素风格心理学短视频的方法。通过创建工作流、设置变量节点、调用大模型生成文案、数据格式化处理、合成音频、生成字幕等步骤,最终实现从输入主题到生成完整视频的自动化流程。文章详细展示了每个节点的具体配置方法,包括提示词编写和数据处理脚本,为读者提供了完整的像素风格视频制作解决方案。

820

[TwistedFate]继承 初始化方法 便利构造器

1.继承的特性: - 继承是单向的 - 继承是可传递的 - 不能相互继承 - 继承:就是子类继承父类的方法和实例变量 - 继承的好处:减少代码量 提高工作效率 2.继承中方法的调用 - 使用self调用方法的时候: 优先调用本类中的方法 没有继续查找上一级,找到就调用,没有继续查找,都没有程序崩溃 - 使用super调用方法的时候: 直接跳过本类去查找上一级的父类

Do not just be a pragrammer 476

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

[TwistedFate]NSArray NSNumber NSValue

1.数组:存储的必须是对象类型 不可变数组:NSArray 不可变数组 切记不能进行增删操作 // 数组初始化方法 NSArray *array = [NSArray alloc] initWithObjects:@"王龙",@"壮壮",@"张文",@"赵杰",@"徐阳", nil]; // 便利构造器 NSArray *array1 = [NSArray arrayWithObjects

Do not just be a pragrammer 465

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

[TwistedFate]category Extensxion protocol

类目category 类目特点:可以给看不到实现的系统类添加方法 并且添加的方法 使用系统类的对象 或者 类名 直接就可以调用的切记:1.只能添加方法 不能添加实例变量 2.类目中添加的方法相当于直接添加到系统类中 是可以被继承的 注意:在实际编程中,应注意积累,对以后的编程能提供很大的便利延展Extension 或者 @implementation Function // 私有

Do not just be a pragrammer 449

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

[TwistedFate]高级内存管理 多态

内容回顾Person *p = [[Person alloc] init]; NSString *name = [[NSString alloc] initWithFormat:@"王龙"]; NSString *name1 = [[NSString alloc] initWithFormat:@"zhuanghzhua"]; p.name = name; NSLog(@"%ld",name.re

Do not just be a pragrammer 447

[TwistedFate]OC面向对象

1.OC的输出方法:NSLog(@"这是OC的第一个工程"); // 默认输出换行2.@符 是OC关键字的标志 3.C语言基本数据类型 :int float char OC常用基本数据类型:NSInteger 整型 CGFloat 浮点型 NSString 字符型 4.定义一个字符串:NSString *string = @"今天你吃了吗?"; // 如果有星* 就代表这是一个对象 //

Do not just be a pragrammer 437

copy和mutablecopy

对于系统的非容器类对象,我们可以认为,如果对一不可变对象复制,copy是指针复制(浅拷贝)和mutableCopy就是对象复制(深拷贝)。 如果是对可变对象复制,都是深拷贝,但是copy返回的对象是不可变的。 系统的容器类对象:指NSArray,NSDictionary等。对于容器类本身,上面讨论的结论也是适用的,但是注意的是,容器内的元素内容都是指针复制。如果需要元素对象也是对象复制,就需要实

Do not just be a pragrammer 436
上一篇: iOS_CoreData的使用
下一篇: iOS国际化
zZZ浮生
博客等级 码龄11年 12粉丝 70原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值