ios block dispatch_queue_t 使用demo.

iOS面试:GCD的队列(dispatch_queue_t)分哪两种类型? 简单来说,GCD 的队列主要分为两种类型:串行队列和并行队列。串行队列按顺序一个接一个地执行任务,而并行队列则允许多个任务同时执行。:虽然不直接被列为串行队列或并行队列,主队列实际上是一个特殊的串行队列。并行队列允许同时执行多个任务。任务的执行顺序并不确定,具体的执行顺序取决于系统的调度。是 GCD 中的一个重要对象,用于管理和调度要执行的任务。在这个例子中,我们使用了一个全局的并行队列,所有提交到这个队列的任务可以并行执行,从而提高效率。是一个串行队列,所有提交到这个队列的任务将会按照顺序逐个执行。 阅读详情

关于block的介绍我就不多说了.

dispatch_queue_t 还在学习了解当中..


2者结合的好处就是异步处理数据.在方法内部返回结果,直接可以直接使用方法类的变量,类的成员和变量等..优化减少代码量.


使用的IDE是xcode4.5测试版.

代码使用ARC模式.ios6下面dispatch_queue_release已经取消.低于ios6版本的SDK在CWImageInfo的dealloc内添加.

dispatch_queue_release(_queue);


新建 CWImageInfo类.

#import <Foundation/Foundation.h>

@interface CWImageInfo : NSObject {
    
    //block
    void (^_block_) (UIImage *image, NSUInteger nTag, NSString *sKey);
    
    dispatch_queue_t    _queue_;
}

- (BOOL) downloadWithURL:(NSURL *) url
                     tag:(NSUInteger) nTag
                     key:(NSString *) sKey;


#if NS_BLOCKS_AVAILABLE

- (void) setCompleteBlock:(void (^)(UIImage *image, NSUInteger nTag, NSString *sKey))block;

- (BOOL) downloadWithURL:(NSURL *) url
                     tag:(NSUInteger) nTag
                     key:(NSString *) sKey
                   block:(void (^)(UIImage *image, NSUInteger nTag, NSString *sKey))block;

#endif
@end

实现代码:

#import "CWImageInfo.h"

@implementation CWImageInfo

- (id) init {

    if (self = [super init]) {
        if (_queue_ == nil) {
            _queue_ = dispatch_queue_create("com.watsy.imageDownload", nil);
        }
    }
    
    return self;
}

- (BOOL) downloadWithURL:(NSURL *) url
                     tag:(NSUInteger) nTag
                     key:(NSString *) sKey {
    if (url == nil) {
        return NO;
    }
    
    dispatch_async(_queue_, ^{
        NSData *data = [NSData dataWithContentsOfURL:url];
        UIImage *image = [UIImage imageWithData:data];
        
        dispatch_async(dispatch_get_main_queue(), ^{
            _block_(image, nTag, sKey);
        });
    });
    
    return YES;
}

- (BOOL) downloadWithURL:(NSURL *) url
                     tag:(NSUInteger) nTag
                     key:(NSString *) sKey
                   block:(void (^)(UIImage *image, NSUInteger nTag, NSString *sKey))block {
    if (url == nil) {
        return NO;
    }
    
    dispatch_async(_queue_, ^{
        NSData *data = [NSData dataWithContentsOfURL:url];
        UIImage *image = [UIImage imageWithData:data];
        
        dispatch_async(dispatch_get_main_queue(), ^{
            block(image, nTag, sKey);
        });
    });
    
    return YES;
}

- (void) setCompleteBlock:(void (^) (UIImage *image, NSUInteger nTag, NSString *sKey)) block {
    _block_ = block;
}

@end

修改启动入口:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // Override point for customization after application launch.
    self.viewController = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil];
    UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:self.viewController];
    self.window.rootViewController = navController;
    [self.window makeKeyAndVisible];
    return YES;
}



ViewController.m内添加

- (void) viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    
    UIActivityIndicatorView *IndicatorView = [[UIActivityIndicatorView alloc] initWithFrame:CGRectMake(0, 0, 25, 25)];
    IndicatorView.backgroundColor = [UIColor clearColor];
    IndicatorView.activityIndicatorViewStyle = UIActivityIndicatorViewStyleWhite;
    
    UIBarButtonItem *refreshItem = [[UIBarButtonItem alloc] initWithCustomView:IndicatorView];
    self.navigationItem.rightBarButtonItem = refreshItem;
    [IndicatorView startAnimating];
    
    NSArray *imageAddArray = [NSArray arrayWithObjects:
                              @"http://www.xuefo.net/user/editor/uploadfile/20111128175139918.jpg",
                              @"http://www.xuefo.net/user/editor/uploadfile/20111128175139846.jpg",
                              @"http://www.xuefo.net/user/editor/uploadfile/20111128175140661.jpg",
                              @"http://www.xuefo.net/user/editor/uploadfile/20111128175140907.jpg",
                              @"http://www.xuefo.net/user/editor/uploadfile/20111128175143708.jpg",
                              @"http://www.xuefo.net/user/editor/uploadfile/20111128175143551.jpg",
                              @"http://www.xuefo.net/user/editor/uploadfile/20111128175144636.jpg",
                              @"http://www.xuefo.net/user/editor/uploadfile/20111128175144761.jpg",
                              @"http://www.xuefo.net/user/editor/uploadfile/20111128175147655.jpg",
                              @"http://www.xuefo.net/user/editor/uploadfile/20111128175147652.jpg",
                              @"http://www.xuefo.net/user/editor/uploadfile/20111128175148276.jpg",
                              @"http://www.xuefo.net/user/editor/uploadfile/20111128175148942.jpg",
                              @"http://www.xuefo.net/user/editor/uploadfile/20111128175148505.jpg",
                              @"http://www.xuefo.net/user/editor/uploadfile/20111128175148894.jpg",
                              @"http://www.xuefo.net/user/editor/uploadfile/20111128175149393.jpg",
                              @"http://www.xuefo.net/user/editor/uploadfile/20111128175149643.jpg",
                              @"http://www.xuefo.net/user/editor/uploadfile/20111128175149315.jpg",
                              @"http://www.xuefo.net/user/editor/uploadfile/20111128175149619.jpg",
                              @"http://www.xuefo.net/user/editor/uploadfile/20111128175150388.jpg",
                              @"http://www.xuefo.net/user/editor/uploadfile/20111128175150462.jpg",
                              @"http://www.xuefo.net/user/editor/uploadfile/20111128175150902.jpg",
                              @"http://www.xuefo.net/user/editor/uploadfile/20111128175150699.jpg",
                              @"http://www.xuefo.net/user/editor/uploadfile/20111128175151668.jpg",
                              @"http://www.xuefo.net/user/editor/uploadfile/20111128175151565.jpg",
                              @"http://www.xuefo.net/user/editor/uploadfile/20111128175151818.jpg",
                              @"http://www.xuefo.net/user/editor/uploadfile/20111128175151769.jpg",
                              @"http://www.xuefo.net/user/editor/uploadfile/20111128175152107.jpg",
                              @"http://www.xuefo.net/user/editor/uploadfile/20111128175152489.jpg",
                              @"http://www.xuefo.net/user/editor/uploadfile/20111128175152906.jpg",
                              @"http://www.xuefo.net/user/editor/uploadfile/20111128175152111.jpg",
                              @"http://www.xuefo.net/user/editor/uploadfile/20111128175153957.jpg",
                              @"http://www.xuefo.net/user/editor/uploadfile/20111128175153205.jpg",
                              @"http://www.xuefo.net/user/editor/uploadfile/20111128175153252.jpg",
                              @"",nil];
    NSMutableArray *imageArray = [[NSMutableArray alloc] initWithCapacity:10];
    
    CWImageInfo *cImgInfo = [[CWImageInfo alloc] init];
    for (int i = 0; i < [imageAddArray count]; i++) {
        NSURL *url = [NSURL URLWithString:[imageAddArray objectAtIndex:i]];
        
        [cImgInfo downloadWithURL:url
                              tag:i
                              key:[url path]
                            block:^(UIImage *image, NSUInteger nIndex, NSString *sKey){
                                
                                NSLog(@"download  index:%d key:%@",nIndex,sKey);
                                
                                if (image != nil) {
                                    [imageArray addObject:image];
                                }
                                     //全部下载完毕
                                 if(nIndex == [imageAddArray count] - 1) {
                                     self.navigationItem.rightBarButtonItem = nil;
                                     self.ibAnimationImageView.animationImages = imageArray;
                                     self.ibAnimationImageView.animationDuration = nIndex;
                                     [self.ibAnimationImageView startAnimating];
                                 }
                            }];
    }
}




iOS校招笔试核心考点解析:从基础语法到内存管理与Runtime 在移动开发技术迭代加速的今天,iOS开发者不仅需要熟练使用Swift或Objective-C编写业务代码,更需深入理解底层原理,才能从容应对大厂面试与复杂工程问题。以Objective-C语言特性为基础,内存管理中的ARC与weak表机制、Runtime的消息转发与Method Swizzling、多线程编程中的GCD死锁与数据竞争,共同构成iOS进阶的核心知识体系。理解这些原理,不仅有助于破解面试中关于循环引用、KVO底层实现、block捕获变量等高频难题,更能在实际开发中指导解决内存泄漏、页面卡顿、接口 阅读详情

相关推荐

爱奇艺iOS校招笔试全解析:从内存管理到签名上架

iOS开发作为移动互联网的核心方向,对工程师的要求早已超越单纯编码。内存管理、多线程、布局适配等底层机制,决定了App在复杂场景下的稳定性与性能表现。以ARC为例,编译器自动插入引用计数操作,却无法解决循环引用问题;GCD队列虽简化并发编程,但同步派发到串行队列仍可能引发死锁。理解这些原理,不仅有助于写出高质量代码,更是排查线上崩溃、优化用户体验的关键能力。在视频类App中,弱网适配、播放器性能、界面流畅度都直接依赖上述技术功底。爱奇艺2018年校招iOS笔试正是以此为纲,系统考察了语言基础、系统机制、UI

weixin_30336061的博客 388

iOS-dispatch_queue_t

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33802505的博客 522

iOS面试核心考点:内存管理、RunLoop与runtime实战解析

iOS开发中,内存管理与多线程机制是构建流畅应用的核心基石。理解weak指针在运行时全局表中的自动置空原理,掌握RunLoop的mode切换对定时器的影响,以及GCD同步派发引发的死锁场景,是应对中高级面试的关键。这些底层知识在直播类高并发场景下尤为重要——弹幕高频刷新、心跳常驻线程、动态方法解析,每一个难题都指向对引用计数、运行时消息转发和界面优化框架的深入理解。通过拆解欢聚时代笔试B卷的典型考点,结合对象池复用、Safe Area适配和崩溃符号化等实战经验,帮助开发者建立从原理到工程实践的完整认知,从容

weixin_34186128的博客 386

iOS多线程的初步研究(八)-- dispatch队列

GCD编程的核心就是dispatch队列,dispatch block的执行最终都会放进某个队列中去进行,它类似NSOperationQueue但更复杂也更强大,并且可以嵌套使用。所以说,结合block实现的GCD,把函数闭包(Closure)的特性发挥得淋漓尽致。   dispatch队列的生成可以有这几种方式: 1. dispatch_queue_t queue = dispatch_q

冷胜任 的专栏 3万+

Python+Selenium多进程爬虫:稳定抓取动态留言板数据全解析

在网站数据采集场景中,动态加载的页面内容常让传统爬虫束手无策。当留言板等交互页面通过JavaScript异步渲染数据时,仅靠requests模拟HTTP请求很难获取完整信息。Selenium作为浏览器自动化工具,能够真实驱动浏览器渲染DOM,配合多进程并行模型可有效提升采集效率。多进程架构不仅解决了WebDriver实例间的相互干扰,还能合理利用多核资源,是构建稳定爬虫系统的重要技术路线。这类技术方案广泛应用于评论采集、舆情监控、用户反馈分析等场景,尤其适合处理登录态保持、翻页加载、增量抓取等复杂需求。本文

weixin_33965305的博客 332

vnpy_ctp源码下载后转变为python可用的处理过程

vnpy_ctp源码下载后在window中编译使用

m0_37967652的博客 3328

GCD-----dispatch队列(iOS线程)

GCD的核心就是dispatch队列,dispatch_block的执行最终都会放进某个队列中进行,它类似NSOperationQueue,但更复杂也,也更有效,结合block实现的GCD会把函数的闭包特性发挥出来一、队列的生成方式 1、dispatch_queue_t queue = dispatch_queue_create(“lining1.queue”,DISPATCH_QUEUE_SER

ningn111的博客 451

rk3568 OpenHarmony4.0如何使用中文输入法

问题:rk3568开发板 OpenHarmony4.0release系统自带输入法kikaInput软件只有英文输入,不含中文输入,不方便。本文基于rk3568开发板 OpenHarmony4.0release移植了laval社区发布的开发者手机中的搜狗输入法(测试版),实现了中文输入,为OpenHarmony4.0release的其他开发板中文输入提供参考。

Devlin_的博客 2918

iOS——【GCD】

GCD指的是Grand Central Dispatch,它是苹果公司开发的一套多线程编程技术。GCD提供了一种简单而有效的方式来管理应用程序中的并发任务。它通过将任务提交到适当的队列(串行队列或并发队列)来管理并发执行的任务,从而帮助开发者更轻松地实现并发编程,提高应用程序的性能和响应速度。上面的就是在后合线程中执行长时间处理,处理结束时,主线程使用该处理结果的源代码。这样,dispatch_async (queue, ^{ 这仅有 一行的代码表示让处理在后台线程中执行。

m0_73348697的博客 1921

地平线天工开物AI开发平台实战:从量化训练到模型部署的完整指南

本文提供了地平线天工开物(OpenExplorer)AI开发平台的实战指南,详细解析了从量化训练到模型部署的完整流程。文章重点对比了量化感知训练(QAT)与训练后量化(PTQ)两条核心路径的优劣与适用场景,并分享了图像分类模型PTQ部署的实战经验与常见问题调试技巧,旨在帮助开发者高效地将AI模型部署到地平线AI芯片上。

weixin_29046035的博客 457

4万字一文带你看懂车载摄像头技术、市场、发展前景

1、小孔成像 在战国初期,我国学者墨子(公元前468年-公元前376年)和弟子们完成了世界上第一个小孔成像的实验,并记录在《墨经》中:“景到,在午有端,与景长。说在端。”“景。光之人,煦若射,下者之人也高;高者之人也下。足蔽下光,故成景于上;首蔽上光,故成景于下。在远近有端,与于光,故景库内也。” 此文解释了小孔成倒像的原因,指出了光沿直线传播的性质。这是对光直线传播的第一次科学解释。 而西方世界直到公元前350年,古希腊学者亚里士多德提出光学法则,西方人从此了解小孔成像的光学原理。

m0_58838529的博客 1498

【iOS】锁

iOS里有很多锁的类型,在前面的【iOS】多线程基础中我们反复提到了锁,这里我们就来着重分析一下各类锁,先来看一下各类锁的性能数据对比图。

2401_86200358的博客 346

ISA-95(S95)标准详解

ISA-95是制造业系统集成的“通用语言”,通过分层模型和信息流规范,打通企业计划层与设备控制层,成为实现数字化工厂的核心标准之一。其与ISA-88的协同应用,可进一步优化生产执行与资源管理的效率。标准,旨在解决企业商业系统(如ERP)与工业控制系统(如MES、SCADA)之间的集成问题。

「东哥说MES」 专注于MES制造执行系统,为你拆解核心架构、功能模块及与ERP/PLC的集成逻辑。提供从入门到精通的系列干货、精选行业报告与实用工具,构建你的数字化知识体系,关注我,用实战经验照亮你的数字化之路。 3741

iOS多线程编程应用Demo

多线程开发Demo 1.dispatch_async方法确定在哪个线程队列中执行哪些操作,操作用block实现。 2.DISPATCH_QUEUE_PRIORITY_DEFAULT默认线程队列,dispatch_get_main_queue()主线程队列。 3.block中需要修改公共变量,则变量需要用__block修饰,只读的变量可以不用__block,而是在block中复制一个同名...

weixin_30673715的博客 108

以太网物理层协议整理(2)-万兆以太网

在万兆以太网标准化过程中,IEEE和10GEA(万兆以太网联盟)是两个最重要的组织。 万兆以太网标准和规范都比较繁多,在标准方面,首先有2002年的IEEE 802.3ae,后来也不断有新的万兆以太网规范推出,如2006年的IEEE 802.3an标准(10GBase-T)就推出了基于双绞铜线的万兆以太网规范,同样的IEEE 802.3aq标准推出了基于光纤的10GBase-LRM;2007年的

NowOrNever 3万+

基于CAN FD总线的ECU软件刷写全流程实战:报文详解、应用案例与代码实现

CAN FD(Controller Area Network Flexible Data Rate)总线作为传统CAN总线的升级版本,核心优势在于突破了传统CAN 8字节数据长度限制(最大支持64字节),同时提升了传输速率(仲裁段500kbps,数据段最高10Mbps),完美适配汽车ECU软件镜像体积不断增大的需求,已广泛应用于新一代汽车电子控制系统中。

getusushu的博客 203

Objective C 高级进阶 — GCD队列浅析(二)

前边讲解了如何创建GCD队列,下边接着来讲解如何执行一个队列, 请看官方原文 dispatch_async Submits a block for asynchronous execution on a dispatch queue and returns immediately. void dispatch_async( dispatch_queue_t queue, di

疯狂原始人 2470

流媒体之LL-HLS 低延时HLS协议

LL-HLS协议通过扩展了HLS协议,为实时直播场景提供了更丰富的功能,如延迟控制、播放列表增量更新、阻止播放列表重新加载等。同时客户端可以更灵活地控制播放列表的加载和播放,以适应各种场景和需求。LL-HLS在直播中的延时可以控制在3s内, 但是即使这样, 还是不如RTMP, RTSP等协议的实时性。

技术控的笔记 3368

滥用单例之dispatch_once死锁

不错的一篇libdispatch源代码的文章,虽然看过,但记录一下。 转载连接:http://satanwoo.github.io/2016/04/11/dispatch-once/ 现象 上周排查了一个bug,现象很简单,就是个Crash问题。但是读了一下crash Log以后,却发现堆栈报的错误信息却是第一次见到(吹牛的说,我在国内的iOS也能算第

game3108的专栏 787

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

停止方法iOS CGD 任务开始与结束

改章节是一篇关于停止方法的帖子     尾末有demo地址     1.在Controll中加上一个button      1 2 3 4 5 6 7 8 9 10 - ( void )viewDidLoad {      [super viewDidLoad];      UIButton * tempButton = [UIBu...

weixin_33875564的博客 155

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

macOS 零延迟音频路由:BlackHole 虚拟设备实操配置指南

在 macOS 上,你想把 A 应用播放的声音交给 B 应用接收,系统本身不提供这条路。BlackHole 是一个 macOS 虚拟音频设备,它在音频子系统层注册一个虚拟设备来实现零延迟音频路由:任何应用都能把它当输出写入,任何应用都能把它当输入读取,驱动本身不增加额外延迟。它没有控制面板也没有菜单栏图标,只出现在 Audio MIDI Setup 和各音频应用的设备下拉列表里,所有配置都在这两者

gitblog_01041的博客 293

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

iOS秋招笔试复盘:从内存管理到RunLoop的核心考点解析

在iOS研发岗位的招聘中,笔试环节往往比面试更早暴露候选人的技术功底。尤其对于应届生而言,理解Objective-C的底层机制、内存管理、多线程并发以及RunLoop运行逻辑,是应对校招笔试的关键。内存管理中的strong、weak、copy修饰符选择,autoreleasepool的作用时机,以及循环引用的打破方法,都是高频考察点。多线程方面,GCD与NSOperation的适用场景、dispatch_group与信号量如何协同任务,既是原理也是工程实践。RunLoop的模式切换解释了UIScrollVi

weixin_33946020的博客 314

网易2020校招iOS笔试考点全解析:从OC运行时到内存管理

在移动开发技术栈中,Objective-C语言功底与iOS运行时机制是开发者进阶的核心基石。理解引用计数、weak指针底层实现及消息转发流程,不仅能解决内存泄漏与崩溃问题,更是构建高质量iOS应用的关键。随着大厂校招对实战能力的要求提升,笔试题目愈发注重考察候选人对底层原理与工程细节的掌握。从内存管理到GCD多线程,从Block循环引用到UI布局适配,这些知识点共同构成了iOS开发者的必备技能树。本文以网易2020校招iOS开发工程师笔试题为例,系统拆解其考察逻辑与高频考点,帮助应届生与初中级开发者梳理备考

weixin_33095355的博客 217

货拉拉iOS笔试题复盘:并发、内存与地图定位实战考点全解析

在iOS开发中,线程安全、内存管理和地图定位是构建高可用应用的核心基础。并发操作常因原子性不足导致数据竞争,需借助GCD栅栏、os_unfair_lock等机制实现读写安全;NSTimer与Block的强引用环则要求开发者理解RunLoop与weakSelf的配合;而地图定位场景还需关注坐标系转换、后台定位与轨迹上报。面对弱网环境,长连接心跳与指数退避重连、消息序号与幂等设计也是保障实时性的关键。这些技术点共同构成了货运物流类App的工程底座。本文以货拉拉校招笔试题为例,逐题剖析并发扣款、内存泄漏、偏航检测

weixin_34417183的博客 405

爱奇艺iOS秋招笔试真题解析:考点拆解与备战策略

iOS开发者在准备大厂笔试时,常面临知识点庞杂、考察深度不确定的困境。从语言基础到内存管理,从并发编程到网络架构,每一环节都可能成为失分点。其中,ARC的循环引用、GCD队列死锁、Runloop机制等是高频考点,也是实战中容易踩坑的技术细节。理解这些原理不仅有助于应对笔试题,更能提升工程代码的健壮性。值得注意的是,笔试往往通过变体题型考察候选人的真实理解,而非单纯记忆。因此,构建系统化的知识树、掌握结构化答题方法、在项目中沉淀技术亮点,是高效备战的三大支柱。本文以爱奇艺一套经典秋招笔试为样本,拆解考点背后的

weixin_34013044的博客 370

爱奇艺iOS校招笔试题复盘:内存管理、Runtime与多线程核心考点

在iOS开发中,内存管理和Runtime机制是面试题中最常见的考察方向,也是决定应用性能与稳定性的地基。理解属性修饰符、block循环引用、消息发送与转发流程,能帮助开发者从源码层面真正掌握Objective-C的动态特性。与此同时,多线程与RunLoop的配合使用,直接关系到界面流畅度与并发安全,GCD队列模型和死锁成因更是工程实践中的高频问题。本文顺着爱奇艺2020校招iOS笔试题的出题逻辑,系统拆解iOS面试中的核心知识点,从基础原理到具体应用场景,结合hitTest事件传递、HTTPS握手等网络基础

weixin_30843121的博客 290
上一篇: iOS NSDateFormatter 转换 出现 8小时偏差问题
下一篇: BIOS(basic input output system) 调用
watsy
博客等级 码龄19年 133粉丝 104原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值