私有组件pod 添加支持断点调试的静态库

iOS组件化开发之Pod私有库 iOS组件化开发之Pod私有库组件化的目的: 依赖解耦 开发灵活 团队分工明确 提高代码质量 加快编译速度 解决多团队开发相互影响问题 工具-必选: cocoapods 1.x 之后版本 cocoapods-packager gitlab 工具-可选: zsh item2 cocoapods 是支持 svn 的,但是 git 相对方便一些。 ` **注:**以OTBase` 为例一、创建私有库 阅读详情

我们在给外部提供的sdk 通常使用静态库而不暴露内部代码

而我们自己在项目中测试的时候,都是将静态库的头文件

链接到对应的静态库的.h文件中

一般来讲都是一个workspace 然后添加静态库的工程

添加.a库路径 添加头文件路径,再运行就可以将断点

打到静态库的project 里面去。

而在组件化的工程的pod库中,怎么把断点也能打到对应的

project 里面去呢。

方式就是将podspec 的路径放到最外面,不放在最外面会读不出来。

然后将你手动修改的头文件路径和.a库的位置用spec 的语法写出来

最后pod install 即可

这是最终生成的结果,
这里写图片描述

如果没有进入断点,说明.a库 和pod里面不是同一个,应该先运行一下静态库,
在运行一下工程。

这里是配置静态库打出来的.a库的位置, 你可以自己写个路径,我这里没做真机和
模拟器的合并,你可以自己做,
这里写图片描述

为什么要改写这个路径,因为苹果每次打出来的路径都在缓冲路径里面的,你都读不到,找个固定的位置,才能给别的工程使用。

pod 本地的这个项目即可
这里写图片描述

这里是podspec 的语法写法,注意最后三行
倒数第三行是把.h加进去,
最后两行是把.a静态库加进去
但实际上只是把静态库项目中的文件做了个引用,并没真正重新拷贝一份
这里写图片描述

最后看一下项目中的podsepc 的位置,是在整个项目的前面的,
我试过写在里面,发现相对路径都读不到,所以要使用这个的时候,一定要把路径写在
最外面

这里写图片描述

到这里整个项目就完成了。

这里只是一个非常简单的项目,如果你的静态库需要做组件化下的断点调试,

那这就是你要找到的答案。

项目Demo下载地址

Swift静态Pod私有库踩坑 首先你应该掌握以下几点知识: 1、动态库、静态库的区别,以及对应的架构合并、拆分。 2、Xcode对应的workspace、project、target的关系。 3、Pod依赖可以是源码、静态库(.a+framework)、动态库(framework)。 4、源码依赖的情况下,Pod打包进宿主工程可以选择是全部静态库打包还是动态库打包,或者某个库单独设置。 5、CocoaPods本地仓库缓存。 以上只是大概列举了一部分比较重要的,其实这块涉及到的知识点非常之多,如果你仅仅是为了实现这些功能,而并没 阅读详情

相关推荐

iOS - 静态库、动态库从浅到深学习之路 (三)

XCFramework (framework的增强版) 说明: 1. 苹果官方推荐,支持的,可以更加方便多个平台和架构的分发二进制库的格式。 2. 需要xcode11以上支持 3. 在2019年提出的framework的另一种先进格式。 多架构合并 架构打包命令: // 打包成模拟器架构 xcodebuild archive -project 'SYTimer.xcodeproj' \ -scheme 'SYTimer' \ -configuration Release \ -dest...

zhonggaorong的专栏 1313

调试断点,在没有对方代码的情况下,可以断点调试静态库或者可执行文件。

Symbolic Breakpoint 通过类名以及方法名来添加断点的一种方式。例如: 测试当前界面的viewDidLoad是否调用,判断类的某个方法,写成:-[ViewController viewDidLoad]即可。 也可以直接在类的类别中进行添加,如下面的类别方法。 1 -[NSObject(NSObject) doesNotRecogn

Jacky Shin的专栏 5272

iOS 进阶:Awesome - Runtime

Github开源地址,一步一步教你怎么使用 一、概述 经过多年的发展,美柚iOS项目代码已经达到40W行+的规模,所使用的 Pod 库的数量达到了110+,App Store 安装包210M+,在这么大的项目规模下(CI机器 MAC配置:3 GHz 8-Core Intel Xeon E5;时间:发布20min+),(开发机器iMac :Retina 5K, 27-inch, 2017 融合硬盘;时间:build30min+)打包、编译问题逐步成为我们团队一个躲不过的痛,严重影响了我们的研发效率与其他.

iOSjack的博客 437

解决在ios项目中运行pod install问题

pod install问题

逐梦人.的博客 2124

pod 添加支持断点调试的静态库

这里只是一个非常简单的项目,如果你的静态库需要做组件化下的断点调试, 那这就是你要找到的答案。

cs188Inference in Bayes Nets(贝叶斯网络的推理)

cs188Inference in Bayes Nets贝叶斯网络的推理Question1(3 points):Bayes Net StructureQuestion2(1 points):Bayes Net ProbabilitiesQuestion 3(5 points):Join FactorsQuestion4(4 points):EliminateQuestion5(4 points):NormalizeQuestion 6(4 points):Variable EliminationQuesti

weixin_46582817的博客 1673

iOS中的断点调试

App界面调试工具Reveal [开发者专用] 今天要为大家介绍 App 界面调试工具 Reveal 在 Reveal 中可以实时对正在编写的App界面进行动态查看和编辑,使用 Reveal 2 进行界面调试,首先需要对App项目进行一些设置。 下面来介绍两种方法。 方法一:使用 Cocoapods 添加 Reveal 服务 首先编辑项目的 Podfile,添加如下代码: pod ‘Reveal-SDK’, :configurations => [‘Debug’] 打开终端,在项目目录中运行 pod

BianHuanShiZhe的专栏 2049

视频教程-Ps教程之神奇的Photoshop自动化技术-Photoshop

Ps教程之神奇的Photoshop自动化技术 10年以上IT行业工作经验、三...

weixin_28812857的博客 1474

如何打断点

如何打断点 1. 打开要进行调试的程序,找到想要程序运行到此处停下调试的地方。 2. 设置断点 方法一:可以在想要调试停住的那一行最左侧的单击鼠标右键 -> Toggle Breakpoint,断点就打好了 方法二:双击行左侧即可,与方法一同样的效果 3. 取消断点 方法一:与打断点方法一相同,在想要调试停住的那一行最左侧的单击鼠标右键 -> Toggle Breakpoint,...

weixin_45628785的博客 1万+

SpringBoot实战(二十八)集成 Collabora Online 实现在线编辑

SpringBoot实战(二十八)集成 Collabora Online 实现在线编辑

ACGkaka的博客 6983

Windows版MySQL8.4.2LTS解压直用(下载免安装-绿色-项目打包直接使用-含卸载)

安装前运行微软常用运行库全集(也可能称为依赖)关于MySQL8中相关参数配置,可通过。选择8.5.2LTS长期服务版。选中密码,右键会直接复制。

xzzteach的博客 1440

automake生成静态库文件_基于CocoaPods的组件化原理及私有库实践

轮子为什么会存在智人能在残酷的进化大战中存活下来,原因之一就是智人懂得将知识沉淀成外物,辅助彼此之间的合作,从而使得整个群体产生了规模效应,即1+1>2的效果。从一个角度上说,石器时代是基于石器的组件化的时代,因为老张家的石矛(或其它石头利器)借给了老王,一样可以拿去狩猎。要想实现这个目的,一定要保证:石矛足够锋利。不然贸然拿着石矛去找野兽就变成了给野兽送夜宵。石矛容易使用。如果是...

weixin_31463861的博客 197

win11 使用 QEMU 配置龙芯 3A5000 虚拟环境

win11 使用 QEMU 配置龙芯 3A5000 虚拟环境

一朵花开的时间 6150

3步定位iOS崩溃:Flipper断点调试实战指南

你是否还在为iOS应用崩溃日志晦涩难懂而头疼?是否因无法实时观察变量变化而反复重启调试?本文将通过Flipper(移动开发者桌面调试平台)的断点调试功能,带你掌握从崩溃发生到问题修复的全流程解决方案。读完本文你将学会:配置Flipper断点环境、设置条件断点捕获异常、利用插件分析崩溃上下文,最终实现5分钟定位常见崩溃问题。 ## 环境准备:5分钟接入Flipper调试能力 Flipper通过C...

gitblog_00013的博客 1013

Veritas NetBackup8.1.1安装

1.在服务器上运行Browser.exe 2.选中安装,点击"NetBackup Server Software Installation" 3.提示一个”UAC模式”,我们确定忽略它 4.下一步 5.接受授权,下一步 6.自定义安装 7.输入Key,并点击”netBackup Master Server” 8.自定义路径,下一步 9.默认端口,下一步 10.创建内置账户 创建本地用户帐户: C:\>net user nbwebsvc <StrongPassword> /

万物皆可学 2万+

模型瘦身术:YOLOv5无损剪枝实战教程

本文介绍了一种YOLOv5模型的无损剪枝方法,通过"稀疏训练+结构化剪枝+微调"的流程,在不损失精度的前提下显著减小模型尺寸并提升推理速度。具体步骤包括:1)稀疏训练给参数排优先级;2)裁剪不重要通道;3)微调恢复精度;4)验证效果。实战部分详细展示了从环境搭建到剪枝实现的完整流程,并分析了剪枝后在边缘设备部署、实时检测等场景的优势。该方法可使YOLOv5s模型从14MB缩减至2-3MB,推理速度提升30%-50%,适用于资源受限设备的轻量化部署需求。

LXY_LOVE36的博客 104

基于CocoaPods的组件化原理及私有库实践

轮子为什么会存在 智人能在残酷的进化大战中存活下来,原因之一就是智人懂得将知识沉淀成外物,辅助彼此之间的合作,从而使得整个群体产生了规模效应,即1+1&gt;2的效果。 从一个角度上说,石器时代是基于石器的组件化的时代,因为老张家的石矛(或其它石头利器)借给了老王,一样可以拿去狩猎。要想实现这个目的,一定要保证: 石矛足够锋利。不然冒然拿着石矛去找野兽就变成了给野兽送夜宵。 石矛容易使用。如果是...

weixin_34403693的博客 453

Python 爬虫实战:豆瓣电影海报批量获取(Top250 榜单 + 可视化展示)

在信息爆炸的时代,数据已成为决策的核心,而数据的获取是数据分析的第一步。本文将详细介绍如何利用 Python 爬虫获取豆瓣电影 Top250 榜单的海报,并对数据进行可视化展示,助你更好地了解电影市场的趋势和用户的喜好。

yansideyucsdn的博客 717

如此之详细组件化私有库制作与引用流程

如何制作私有仓库 在做组件化操作之前有个必须的操作,那就是如何制作私有仓库,以及私有仓库之间的引用问题。 私有仓库 => 私有仓库 => 私有组件 1、创建远端Spec仓库 该仓库的目的作用就是存储私有库spec索引 2、创建本地索引库并和远程索引库进行关联 本地添加spec仓库 pod repo add [Spec仓库名] [Spec仓库地址] 例如:pod repo add PrivatePod git@github.com:xxxx/PrivatePod.git 查看 pod r

qq_34534179的博客 477

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

alsa的动态库安装在哪里_转载---基于CocoaPods的组件化原理及私有库实践

上古时代的轮子从本质上说,组件是通过库的方式来进行封装从而提供给开发者使用。而库,就是一种组织一个或多个文件的方式。在 iOS 8 之前,iOS 只支持以静态库的方式来使用第三方的代码。静态库静态库,在iOS中会被打包成.a文件,配合.h头文件一起可以完成功能的调用。但是在在概念上,静态库是一种All In One的设计思路,因为依赖静态库的代码会把静态库完全链接到App的可执行文件中。也就是说,...

weixin_42305648的博客 195

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

iOS 组件二进制与源码查看及调试方案

好久没有写文章了这里记录一下把项目代码二进制化提高编译效率的整个过程中碰到的问题和解决方案等等。

无聊的专栏 1604

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

iOS 组件二进制-提升编译速度

经过多年的发展,美柚iOS项目代码已经达到40W行+的规模,所使用的 Pod 库的数量达到了110+,App Store 安装包210M+,在这么大的项目规模下(CI机器 MAC配置:3 GHz 8-Core Intel Xeon E5;时间:发布20min+),(开发机器iMac :Retina 5K, 27-inch, 2017 融合硬盘;时间:build30min+)打包、编译问题逐步成为我们团队一个躲不过的痛,严重影响了我们的研发效率与其他团队之间的协作。......

gcs的博客 1388

iOS 二进制第三方库思路之Carthage编译静态库

用Carthage编译你喜欢的静态库 前言 Carthage的基本用法已经在上一篇文章详细介绍了,本文主要针对一个问题的解决方案,那就是如何用Carthage编译第三方库为静态库。和pod package一样,封装了xcodebuild进行编译,省去了繁琐的参数设置,提供更便捷方法使用,Carthage作为后起之秀,维护力度和pod package相比,不是一个量级的,端午花了一天学习了下官方的文档,可以确定Carthage将会是第三方库打包成动态库或者静态库的首选。由于项目都还是...

Deft_MKJing的博客 1747

CocoaPods组件平滑二进制化解决方案

什么是组件二进制化? 在iOS开发中,事实标准是我们使用CocoaPods生成、管理和使用library。这里的library就是一个模块、组件或库。二进制化指的是通过编译把组件的源码转换成静态库或动态库,以提高该组件在App项目中的编译速度。 我们的方案是转换成静态库,也就是.a格式的文件加上暴露出来的头文件。 为什么我们需要二进制化呢? 在我们App开发中,我们逐渐的抽

SuYuMingXiangGuan的博客 1317

iOS之性能优化·提高App的编译速度

一、前言 经过多年的开发和迭代,我相信很多的 iOS 项目代码已经达到几十万行甚至上百万行的规模,所使用的 Pod 库的数量可以达到几十个甚至上百个,App Store 安装包也变得越来越大,在这么大的项目规模下,打包和编译问题逐步成为开发团队一个躲不过的痛,严重影响了研发效率与其他团队之间的协作。 有时间,一台机器同时需要承接七八个项目,多个分支的打包任务,在有多个项目同时打包的情况,尤其显得力不从心。 在硬件资源有限的情况下,并且在无侵入、无影响现有的业务的前提下,如何解决这些成为摆在团队面前的难题和

╰つ栺尖篴夢ゞ 3万+

KVOController编译配置详解:静态库与动态库的选择策略

在iOS/macOS开发中,正确选择KVOController的库类型(静态库或动态库)直接影响应用性能和包体积。本文将从工程配置、适用场景和最佳实践三个维度,帮助开发者快速掌握编译策略。 ## 工程结构与库类型定义 KVOController项目通过Xcode工程提供了完整的编译配置,支持静态库和多平台动态库构建。核心源码位于[FBKVOController/](https://link.g...

gitblog_00841的博客 1069
上一篇: ios平台FFMPEG ts视频文件转码mp4
下一篇: iOS 远程登录自动化打包
csdn_Damon
博客等级 码龄10年 37粉丝 143原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值