Swift 无用代码查找

iOSAPP分析无用代码 iOS APP分析无用代码(A source-code level/Clang Approach) 立即下载

现在已经进入AI时代了,还有人在坚持iOS开发吗?技术群里最近越来越多的兄弟们反馈,行业本来就不好干,现在还要被AI抢饭碗,怎么搞?

我的答案是:拥抱AI,因为它确实能提高生产力!以前可能因为一个api要查半天,现在你问一下AI,直接帮你把简单的功能给实现了!一个字,真香!在编码大模型方面,克劳德真的无人能敌!牛X

有人会问,作为一名iOSer,我们该怎么去拥抱AI呢?就我个人来讲,目前用的最多的就是CopilotForXcode这个库,我觉得广大的iOSer可以尽快用起来!别说自动写代码,个人认为提效是很明显的。

其实Trae国际版的克劳德3.7也挺香,可以去用一下,比某da强的不是一星半点儿,不差钱的大佬直接用Cursor吧!

包大小优化是日常工作中(面试)经常会碰到的场景(技多不压身),那么包大小优化都有哪些方法呢?

一般我们会从资源和代码两个层面下手,比如常见的方式有:无用代码清理、无用资源清理,今天我们主要讲Swift项目的无用代码清理。

一、目前主流的Swift无用代码查找方案有以下几种(AI给出的答案):

1、使用SwiftLint工具

2、使用Periphery

3、使用unused脚本(纯文本搜索代码,简单易懂,好上手)

二、如何使用 unused 脚本:(脚本文件地址位于文章底部【参考1】)

将Ruby脚本unused.rb放到主工程目录下,直接在终端执行以下指令:

ruby unused.rb

执行完成以后,你会发现终端会直接输出项目中未使用到的变量、协议、函数、类、结构体等信息,是不是很方便?
在这里插入图片描述

拿到了这些无用类的文件path,我们就可以直接写个shell脚本来直接删除无用类、结构体、协议。当然这里还要考虑项目中类和文件名不一致的情况,所以其实平时规范一点,一个文件一个class,这样就比较好删除了!

另外,它还可以嵌入到Xcode中,把以下代码片段放到Xcode项目对应的Target中的 Build Phases:
在这里插入图片描述

在这里插入图片描述

unused_file="unused.rb"
if [ -f "$unused_file" ]; then
    ruby unused.rb xcode
fi

脚本嵌入完成后,直接运行项目,运行完成后,Xcode直接会出现未使用的代码警告提示,方便队友在日常编码的时候就能把自己相关的无用代码给删除掉。
在这里插入图片描述
注意:

上述脚本是纯正则匹配的文本搜索,里面可能存在误报的情况,尤其是依赖关系很复杂的情况下,漏报的也比较多,所以正常情况下还是需要开发人员进行二次确认。

除此之外,我们还可以自己编写脚本(可以让AI生成),上面提到的获取class、struct、protocol的文件path,一键删除无用代码。

关于包大小优化这一块,最近网上又有大佬开源了一个工具 APPAnalyze ,我在这里推荐一下(详见参考2),主要是学习一下人家的思路。

三、结语:

关于包大小优化,你需要掌握的关键技术点有:

Xcode构建(不同参数的设置)、LLVM编译原理(插桩查找无用代码)、cocoapods包管理(二进制化加载)、图片压缩(有损/无损)、持续集成卡口设置防裂化。

看完之后,你是不是感觉头都麻了,还有这么多东西要学?那么我建议你先挑软柿子捏:

1、从资源文件下手,因为经过数据对比,从资源文件下手收益是最大的。

2、从代码层面下手,分析LinkMap文件,可以让我们了解类、模块及三方库的代码的占用空间大小,帮助我们快速定位要优化的类或者静态库。

参考:

1、查找无用代码的脚本

2、APPAnalyze


更多好文推荐,欢迎关注 《iOS开发秘籍》 公众号,获取最新的内容

本文内容中部分来自网络,后续会持续更新完善。欢迎一起学习交流!

如需转载,请注明出处

Swift 无用代码查找

iOS之自动检测项目中的无用的图片资源 iOS之自动检测项目中的无用的图片资源iOS之自动检测项目中的无用的图片资源 立即下载

相关推荐

检测项目中无用的图片

一个MAC项目demo检测app应用里面没有用到的图片

CLANG技术分享系列四:IOS APP无用代码/重复代码分析

01 NOV 2016 . CATEGORY: TECH . COMMENTS  #CLANG 问题背景 包瘦身,包瘦身,包瘦身,重要的事情说三遍。 最近公司一款APP一直在瘦身,我们团队的APP也愈发庞大了。就想看看除过资源外,还有那些路径可以缩小包大小,直观来看,业务代码毕竟有限,各种库嫌疑很大,但是如果没有一个定量的分析,一切说辞都显得有些苍白。 当然了所有的APP套路都一样,

小路恢宏随手记 2408

外围:一种在Swift项目中识别未使用代码的工具

在Swift项目中识别未使用代码的工具。 内容 安装 (仅适用于macOS) 安装自制软件: 如果您已经安装了Homebrew,则可以跳过此步骤。 /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" 现在安装Periphery本身: brew tap peripheryapp/periphery && brew install periphery 将外围设备添加到您的Package.swift依赖项: . package ( url : " https://github.com/peripheryapp/periphery " , from : " 2.0.0 " ) 现在通过Swift运行外围设备: swift run periphery scan ... (仅限macOS) 将以下内容添加到您的Podfile中: pod 'Periphery' 现在运行pod install ,将下载Periphery可执行文件并将其

iOS开发——Appcode代码检查分析

优化项目的时候,可以使用Appcode分析功能,即Inspection功能。可以检查未使用的文件,拼写问题,类型检查等多种潜在疑难杂症。 打开菜单-code-选择Inspect Code

吹泡泡的星星 6117

FindUnusedClasses:发现ios项目无用类工具

FindUnusedClasses发现ios项目无用类工具 例子 :check_mark_button:支持查找Object-C无用类 :cross_mark_button:支持查找Swift无用类(待更新) :cross_mark_button:支持查找C ++无用类(待更新) 注意: Build Settings选择Other C Flags添加配置选项: -fsanitize-coverage=func,trace-pc-guard 在任意主线程,调用FindUnusedClasses allUnusedClasses即可,参数是任意自定义类,只要不是系统类即可; 原理:利用编译器在每个方法调用处进行插桩,然后记录次函数指针,最后利用dladdr解析函数指针的具体信息,拿到类名,也就是被执行的类。最后再拿到所有类对象列表,取差集即可,剩下的就是无用类,暂时只支持objc,swift后续会支持。 例1: -(void)viewDidAppear:(BOOL)animated{

swift-Periphery一种用于识别Swift项目中未使用代码的工具

Periphery 一种用于识别Swift项目中未使用代码的工具

iOS xcode 检测项目中的无用的图片工具

项目大改版, 几乎所有的界面图片都需要重新更换. 那么对于之前一个或多个版本的旧的,无用的无效的图片资源,我们不可能一个一个的就找,然后复制图片名字搜索吧(注:这是一种笨方法). 那么接下来讲解的是我用的方法. 二,方法 1,这里有个检测工具LSUnusedResources (地址:https://github.com/tinymind/LSUnusedResources)在github上...

Kun__kun的博客 2311

高通camx架构学习(零)—— 深入理解Camera 硬件抽象层

从上面的定义可以看出,主要是通过hw_module_t 代表了模块,通过其open方法用来打开一个设备,而该设备是用hw_device_t来表示,其中除了用来关闭设备的close方法外,并无其它方法,由此可见谷歌定义的HAL接口,并不能满足绝大部分HAL模块的需要,所以谷歌想出了一个比较好的解决方式,那便是将这两个基本结构嵌入到更大的结构体内部,同时在更大的结构内部定义了各自模块特有的方法,用于实现模块的功能,这样,一来对上保持了HAL的统一规范,二来也扩展了模块的功能。

图像学习之旅 1669

Swift 中的动态成员查找

在 Swift 中,动态成员查找是一种允许在编译时未知成员的情况下,通过字符串名称来访问属性和方法的机制。这在需要与动态数据进行交互,或者在某些情况下进行元编程时非常有用。动态成员查找通过 Swift 的 `@dynamicMemberLookup` 特性实现。

记录从移动端、鸿蒙到物联网与AI的完整实战与思考。专注于分享可复用的工程方案与产品思维,尤其深入鸿蒙生态与全栈开发。以十年工程与管理沉淀,为你提供清晰的技术纵深路径。坚信技术的价值在于“贯通”与“落地”。 2705

全网最新首发纯干货:微信数据库表结构完整分析(一)

找不到微信DB表结构说明?找不到具体字段的解释?来这里,全网最完整版!!!

killghosts的博客 4927

OpenHarmony 4.1/5.0 Beta上手:如何用ArkUI在非华为设备上开发你的第一个“鸿蒙”应用

本文详细介绍了如何在非华为设备上使用ArkUI开发OpenHarmony应用,涵盖从设备选型、环境搭建到应用部署的全流程。通过实战案例展示ArkTS语言在开源鸿蒙生态中的应用,帮助开发者突破设备限制,构建跨平台鸿蒙应用。

weixin_33704234的博客 366

Periphery终极指南:如何快速识别Swift项目中的无用代码

Periphery是一个强大的Swift代码分析工具,专门用于识别Swift项目中的无用代码。这款开源工具通过构建代码依赖图并分析引用关系,能够智能检测出未使用的类、结构体、协议、函数、属性和枚举等声明,帮助开发者清理代码库,提升项目质量。无论你是iOS开发者、macOS应用工程师,还是Swift服务器端开发者,Periphery都能成为你代码优化的得力助手。 ## 🚀 为什么需要代码清理工具

gitblog_00019的博客 316

OCSP环境搭建--Windows Server 2016

OCSP环境搭建--Windows Server 2016 一. OCSP环境中相关信息 1. 服务器1 操作系统:Win Server 2016 Standard版 IP地址:172.16.0.19/23,网关:172.16.0.1,首选DNS:127.0.0.1 服务器角色:域控制器、证书颁发机构、radius服务器、DNS服务器 ...

CsdnCHong_566的博客 3352

算法-哨兵查找法(OC、Swift、Python)

前言 我们在一个数组中想查找某个对象item我们改如何操作呢?很简单一层遍历就可以搞定了,如下: - (NSInteger)searchNormal:(NSArray *)array item:(NSString *)item{ for(int i = 0;i<array.count;i++){ if(array[i] == item){ r...

ZFJ_张福杰 4083

postman响应体:“msg“: “请求缺失签名Sign“、 “msg“: “请求缺失时间戳“

请求标头有Sign、Timestamp,但是直接将网址复制到postman时,Headers没有自动生成这两个参数,所以运行时会报错。

m0_46862648的博客 1706

ADC电路项目1——10bit SAR ADC 设计,smic18工艺,有工艺库,有效位数ENOB为9.8

包括详细仿真文档,原理介绍,完整电路图,仿真参数已设好,可直接使用,在自己的电脑上就可以运行仿真。本设计采用 smic18mmrf CMOS 工艺,使用栅压自举电路的采样开关,Vcm-based 开关。电容开关控制电路,10 位 DFF,最后用 10 位理想 DAC 模块将数字码转换为 10 进制量进。时序上级板采样的 DAC 电容阵列,两级动态比较器,比较器异步时钟,SAR 动态逻辑,DAC。10bit SAR ADC 设计,smic18工艺,有工艺库,有效位数ENOB为9.8。

qq_48407979的博客 814

Swift中的二分查找:全面指南

二分查找是计算机科学中的经典算法,被广泛用于在已排序的数组中高效地搜索目标值。与线性查找逐个检查每个元素不同,二分查找不断将搜索区间减半,因此在处理大数据集时要快得多。 在这篇博客中,我们将探讨二分查找的基本原理,它在Swift中的实现,以及使其如此高效的底层概念。

侯仕奇的博客 625

【Allegro学习笔记】常规标贴封装创建-0402封装创建实例

摘要 本文主要介绍如何使用Allegro制作表面贴装封装。 所使用的软件 使用Allegro制作常规贴片封装主要使用的软件有Pad Designer和Allegro 1 0402类封装制作 1.1 0402类封装焊盘分析 0402封装尺寸图如图1...

Honglong 1万+

swift版 二分查找 (折半查找)

二分查找作为一种常见的查找方法,将原本是线性时间提升到了对数时间范围之内,大大缩短了搜索时间,但它有一个前提,就是必须在有序数据中进行查找。废话少说,直接上代码,可复制粘贴直接出结果! import UIKit class ViewController: UIViewController { let targetNum = 27 let sourceList: ...

weixin_30888027的博客 293

uniapp - 解决uni.getLocation定位不准有偏差,定位经纬度不准确有几百米误差、获取地图定位有偏差怎么办,已配置高精确度但依旧不精准(uni.getLocation定位不准如何解决)

uni.getLocation,获取当前的地理位置、速度。已经设置altitude高精度,uniapp API获取定位有差异问题解决,获取定位有几百米偏差,uni.getLocation(OBJECT)中使用默认type ”wgs84“会导致定位不准的问题,gcj02,uni.getLocation地图定位不准,获取经纬度错误偏移了几十公里,经纬度的精确度误差,怎么消除经纬度偏差,解决 uniapp uni.getLocation 定位经纬度不准问题,使用定位不准,定位不准误差问题,解决定位不准问题,高德地

✅ 精选推荐文章 1万+

pscad IEEE标准系统搭建说明

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

算法与数据结构:查找表的顺序查找、折半查找、插值查找以及Fibonacci查找(Swift版)

查找在生活中是比较常见的,所涉及的这几种查找都是基于线性结构的查找。也就是说我们的查找表是一个线性表,我们要查找某个元素在线性表中的位置。顺序查找就是从头到尾一个个进行比较,直到找到为止,此方法适用于无序的查找表。而折半查找、插值查找以及Fibonacci查找的查找表都是有序的,下方的内容会详细的介绍到。 一、查找协议的定义 因为我们涉及查找表的多种查找方式,而且查找表的数据结构都是线性结构。基于Swift面向对象语言的特征以及面向接口编程的原则,我们先给我们所有的查找方式定义一个协议。本篇博客中所有的

+W❤:bjmsb2019 335

深度学习工具包 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")

swift 数组是否包含 查找数组元素 查找数组索引 查找最大元素和最小元素

contains(_:)判断是否包含给定元素 contains(where:)判断数组是否包含复合给定条件的元素 判断所有元素是否符合某个条件 allSatisfy(_:)判断数组的每一个元素都复合给定的条件 //: A UIKit based Playground for presenting user interface import UIKit var array = [Int](6..<20) print(array.allSatisfy({$0>=5})) print(a

丿灬安之若死 7010

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Swift的二分法查找实践

Swift的二分法查找实践

huangyongf的博客 699

二分查找详解及用 Swift 实现

二分查找是一种高效的查找算法,它的时间复杂度为O(log n),适用于有序数组中查找某个元素的情况。Swift 开发者可以使用二分查找来优化程序的运行效率,尤其是在处理大型数据集时。同时,Swift 中也提供了多种内置的排序算法,如sort()和sorted()方法,可以方便地对数组进行排序,从而进一步提高二分查找的效率。除了常规的二分查找,还有一些变体算法,如左侧二分查找、右侧二分查找和查找第一个大于等于目标元素的位置等。这些算法在实际应用中也经常使用,可以根据具体情况选择相应的算法。

刘铎Derek在优快云 303
上一篇: ITMS-91061: Missing privacy manifest for third-party SDKs
下一篇: Invalid Executable:Xcode16 Bitcode 解决方案
Skinny Camel
博客等级 码龄15年 71粉丝 42原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值