【Bugly干货分享】iOS内存管理:从MRC到ARC实践

CMOS反相器版图设计全解析:PMOS/NMOS布局与VDD/VSS连接门道 版图设计是芯片从电路原理图迈向物理实现的必经桥梁,而CMOS反相器作为最基础的数字单元,恰好是理解这一过程的最佳切入点。在版图绘制中,PMOS与NMOS因导电类型和迁移率差异,需要在N阱与P衬底上分别规划,并呈现出不同的有源区尺寸。真正决定版图好坏的关键,往往在于VDD/VSS的完整连接——不仅要接通源漏,还要通过阱接触和衬底接触固定阱与衬底电位,防止寄生PN结正偏和闩锁效应。合理布局电源地线轨道、优化接触孔数量,能显著降低寄生电阻与电迁移风险。这些原理不仅适用于反相器,也是所有CMOS数字标准单元版图设计 阅读详情

本文作者:王拥军 腾讯自选股高级开发工程师

Bugly 技术干货系列内容主要涉及移动开发方向,是由 Bugly 邀请腾讯内部各位技术大咖,通过日常工作经验的总结以及感悟撰写而成,内容均属原创。

对于iOS程序员来说,内存管理是入门的必修课。引用计数、自动释放等概念,都是与C语言完全不同的。搞明白这些,代码才有可能不 crash。然而就是这么牛逼的内存管理,着实让我这个从 C 转过来的老程序员头疼了一段时间。

[C++ 程序员的迷惑和愤怒]

iOS 内存管理的核心是引用计数。与众多五年甚至更多以上开发经验的程序员一样,笔者当初是从 C/C++转到的 OC,接触到 MRC。当时遇到最头疼的问题就是:为什么那么多 release?到底什么地方会 release?同样初始化一个字符串的两个方法为什么不同?上边一个不需要调用 release,后边一个就需要调用 release?

    NSString * str1 = [NSString stringWithFormat:”qqstock“]; 
   NSString * str2 = [[NSString alloc] initWithData:recvData encoding:NSUTF8StringEncoding];

再加上一个属性赋值与成员变量赋值,一个导致计数器加一,一个就不会!真他妈奇葩了!

    self.name = @“qqstock”;
    _name = @“qqstock”;

不知道是不是所有从 C/C++ 转过来的程序员都遇到过类似的迷惑和愤怒。

[MRC 的初衷和实现方式]

那么,苹果为什么要做这个?

首先,C/C++ 传统的内存管理方式,所有的内存都需要业务代码自己处理,程序员自己一定要知道一个内存对象什么时候不再使用了,一定要知道这个内存对象的终点在哪里。当代码越来越复杂,参与开发的程序员越来越多,甚至随着岁月的流逝更换了新的程序员,这个时候,很难有人说的清了。于是,要么那个内存对象一直留在那里,没人敢释放,整个程序占用的空间越来越大;要么,一个胆大的程序员将它释放掉,某处发生了 crash。尽管大家总结出许多类似“谁创建谁释放”、“谁持有谁释放” 的原则,但都导致存储空间的浪费:为了保留仅仅一个内存对象,却要将与它关联的一大堆对象保留住,而其中大部分已经不再使用了。要么,自己写许许多多的代码,频繁对容器进行主动操作。
腾讯Bugly

于是,苹果要解决这个问题。初衷就是:任何一个内存对象由系统自己处理释放的问题,无论创建者也好,持有者也好,不需要去考虑别人是否还在使用同一个内存对象,做好自己该做的就是了,别人的事情别人负责。苹果实现此目的的手段就是引用计数。所有使用到同一内存对象的地方,使用者只要保证自己 retain 一次,release 一次,就 OK 了,即便别人还在使用,你只要调用 release 将自己的引用次数清零就好了,不用管别人!

与 C/C++传统的内存管理方式相比,MRC 是不是显得非常智能?是不是更加方便?而且,这样做的代价也非常低廉,每一个内存对象增加一个计数器就 OK 了,每一次 release,只需要检查一遍计数器是否为零,如果为零就释放,如果不为零就不执行真正的释放逻辑。

另外,为了解决函数返回值的问题,需要搞一个 autorelease 的东西,否则就会打破这个良好的初衷:“只负责自己范围内的事情就 OK了,不要管别人!”

那么,为什么不将所有内存对象都统一成 retain呢?对于一种编译器,它能够用一个技术解决所有问题,就坚决不会用两种并列的技术导致问题更复杂。

OC 有一个 delegate 的东西,这个东西的出现也是有其现实需求的,在此先跳过。如果所有地方都使用 retain,delegate 的问题一定会导致循环引用,除了 delegate,苹果不敢保证所有用户代码的逻辑都是树形结构的,最简单的比如说循环链表、双向链表,除此之外,业务层肯定也有某些地方必须做成“循环引用”,如果都是 retain,那么,最终处于循环中的内存对象谁也不会被最终释放掉。为了解决这个问题,苹果依然保留了 C/C++的那种弱引用方式。——至少给程序员留个过渡的空间。

[MRC 的优点和无奈]

总结一下:
1. MRC 的计数器机制改善了内存管理的方式,减少了各个模块的逻辑耦合,释放了程序员对“何时该释放”的心理压力,解决了大部分的问题
2. 为了应对各种复杂的场景,很无奈的留了一个口子;
3. 两种模式的并存,对 C++程序员转移到 OC战场,树立了一个无形的心理门槛,使得起步阶段问题更加复杂,比如:retain、assign、release、autorelease 等。

难道就没有更好的方式么?当然有更好的方式,而且一定有许多公司的 C++程序员或者 C 程序员写了类似引用计数的程序,甚至比引用计数还要高级,只不过大多数公司没有实力推广一个编程语言而已。

而且,略微深入思考,一定许多人想到:如果让系统对所有内存对象在运行时统一管理,问题就能彻底解决了。是的,的确如此,一定有人设计出来了。但是,代价比较高。

系统在运行时统一管理所有内存对象的释放,会导致增加额外的内存和 CPU 开销,在硬件设备尚且处于低级阶段的时候,当程序员们依然在努力降低内存降低 CPU 消耗的时候,推出这样的机制,是不合时宜的!

引用计数器的方式,编译器并没有增加太多的逻辑,只是在创建的时候增加一个计数器,在释放的时候编译器自动帮程序员增加一个逻辑判断。这个逻辑并没有增加太多的内存和 CPU 开销。

再来看 autorelease,这个逻辑增加的成本可就大了去了,系统要一直持有该类型的内存对象,直到本次 runloop 结束。所以,无论苹果,还是有经验的程序员,都建议:能不用就尽量不用,能缩短范围就尽量缩短范围。
腾讯Bugly

[编程语言和编译器的发展方向]

由于留了无奈的口子,野指针依然会出现,该 crash 的时候依然 crash。许多人说:这是程序员的问题,如果代码写的足够好,一定不会出现野指针,一定不会出现 crash。是的,如果大家足够小心,如果大家足够尽力,这个世界上不会有任何冲突。

然而,编程语言和编译器的发展,一定向着便利、易用、稳健、职能,甚至傻瓜!如果一个编译器能够让一个对计算机毫无了解的人一天之内搞出自己想要的业务应用,谁又会拒绝呢?

许多程序员都是技术控,自己能做的事情尽量不让别人做,自己能实现的逻辑尽量不用别人的。比如:C++的各种封装、引用,我用 C 也能实现,有什么大不了的!系统提供的各种类库,我自己用底层的代码也能实现,而且性能更优,代码更少!但是,如果你连一个砖头都要自己烧制,连一堵墙都要自己去砌,其它更重要的事情谁去做?

更何况,人,总有打盹的时候。
腾讯Bugly

[ARC 的适时推出]

随着硬件的升级,条件已经成熟了,ARC到来了!

ARC 的初衷是为了让程序员写代码的时候更加便利,最好不用再关注任何内存释放的问题(也不用关注用什么方式初始化的问题)。当然了,解决野指针的问题也是很重要的!总之,让编码更加简单,程序更加健壮!

之前对 C++程序员头疼的问题变得异常简单:

NSString * str1 = [NSString stringWithFormat:”qqstock“];
NSString * str2 = [[NSString alloc] initWithData:recvData encoding:NSUTF8StringEncoding];
self.name = @“qqstock”;    _name = @“qqstock”;

到底何时释放?总之,你不用管了,用你的就好!
到底有何区别?没啥区别,只管用就好了!

笔者之前一直很疑惑,因为自己一直想搞明白到底有何区别——技术控本质。现在,了解了ARC的初衷,也就敢于放心大胆的用了——许多刨根究底的程序员从汇编代码也印证了这个“猜想”。ARC 的目的就是将程序员从 MRC 的各种”不同点“上解脱出来,对于尚未接触过 MRC 的 C 程序员,是非常容易理解的,而对于已经习惯了 MRC 的程序员,反倒有点”不敢相信“!

如果让你做,你会如何实现?逻辑其实很简单。
首先,强引用依然保留 MRC 的方式,因为这样实现的方式代价很低;
其次,一旦出现弱引用,则将内存对象在系统中建立映射表;一旦内存对象因为所有强引用归零而释放,则将所有弱引用指针归零(指向 nil)——应该有一个链表。

其实,将弱引用强制指向 nil,也是一种无奈的方式,按理说,这依然是个隐患,是代码逻辑的缺陷,只是人家帮你将错误的代价降到最低而已。

总之,强引用的逻辑是:如果都不用了,我就释放掉;弱引用的逻辑是:如果释放了,我就置 nil!最终,程序员不需要关注内存的持有和释放问题,更不需要关注别的模块是否依然在使用同一个内存。做好自己分内的事情,别的事情交给系统和编译器!
腾讯Bugly

[总结]

其实,笔者之前对 ARC 的了解也仅仅在 coding 层面,最近打算将老的项目从 MRC 转到 ARC,需要提前让团队的所有人了解代码如何迁移,否则即便依靠一两个人的力量将代码迁移了,开发人员的意识和 coding 依然停留在 MRC,那后续的开发任务将会极其危险。但凡做大的动作就应该首先在团队层面无论是意识还是能力上做好准备,否则就等着填坑吧。

于是突发奇想,想对苹果问一个为什么?即:苹果为什么要搞一个 ARC?任何一件事情,都不是毫无来由的。一个极客程序员可能会突发奇想搞个牛逼的技术来展现自己的才华,但苹果这么大一个公司,做这么大的改动,一定是有缘由的。果不其然,当自己费尽心思将这个问题搞清楚之后,如何 coding 的问题也得到了大幅提升!

回头想想,这条路是很牛逼的,如果所有地方都用强引用,或者所有地方都交予系统管理,势必会导致内存的快速膨胀。某些其它语言的例子就非常明显,无论程序员如何努力,内存也很难降低下来。

一个心得就是:许多问题,如果我们能够站在设计者的立场上考虑,就能够更加清楚自己该如何 coding,设计者的初衷决定了我们 coding 的方式,设计者的 coding 决定了我们的思维方式。

以下是一个简单的 demo,从代码运行结果能够很明显的验证 ARC 下 strong、weak、assign、局部变量、类方法初始化以及 autorelease 等使用方法与MRC下的不同。

首先:使用 retain 类型初始化方法给 weak 和 assign 类型变量赋值时,编译器会报警。
腾讯Bugly

其次:weak 变量当其指向的变量的所有强引用置零后,自己会被置 nil,而 assign 却不会。
腾讯Bugly

再有:weak 变量被置 nil,不是当其指向变量析构的时候,而是在强引用归零的时候就已经发生了。
腾讯Bugly
腾讯Bugly

还有,各种类方法初始化的 autorelease 对象,依然是在 runloop 结束的时候析构的,而 retain 类型的对象,却是在代码模块终止的时候析构的。所以,出于内存管理的考虑,依然建议少用 autorelease。
腾讯Bugly
腾讯Bugly

最后,strong 和 weak 对应的 set 方法,简单了许多哦!
腾讯Bugly

如果你觉得内容意犹未尽,如果你想了解更多相关信息,请扫描以下二维码,关注我们的公众账号,可以获取更多技术类干货,还有精彩活动与你分享~
腾讯Bugly

腾讯Bugly是一款专为移动开发者打造的质量监控工具,帮助开发者快速,便捷的定位线上应用崩溃的情况以及解决方案。智能合并功能帮助开发同学把每天上报的数千条 Crash 根据根因合并分类,每日日报会列出影响用户数最多的崩溃,精准定位功能帮助开发同学定位到出问题的代码行,实时上报可以在发布后快速的了解应用的质量情况,适配最新的 iOS, Android 官方操作系统,鹅厂的工程师都在使用,快来加入我们吧!

用 SAP ABAP ALV 重塑 SM30:可扩展的自定义表维护视图与自动传输实践 文章摘要: 本文提出了一种基于ALV Grid的动态表维护框架,用于替代传统SM30维护视图。该方案通过输入表名自动生成维护界面,支持动态筛选、批量操作和自动传输管理。核心设计包括:利用BAdI实现扩展点、通过行状态字段简化数据变更跟踪、使用Style Table控制单元格编辑权限、集成CTS实现自动传输。相比SM30标准维护,该框架显著提升了交互体验(支持ALV排序/过滤/汇总)和业务扩展性(统一校验与权限控制),同时解决了"维护+传输"流程割裂的问题。文中详细阐述了技术实现方案,并提 阅读详情

相关推荐

Vivado 18.3安装全攻略:从下载到配置的完整指南

本文详细介绍了Vivado 18.3的安装全流程,从下载准备到配置优化,特别适合FPGA开发者。文章包含硬件要求、版本选择、组件配置等实用技巧,帮助用户避免常见安装问题,确保稳定运行。重点解析了License配置和系统优化设置,提升开发效率。

weixin_28331555的博客 567

集成腾讯Bugly使用步骤以及字符串的上传(IOS手把手)

集成腾讯Bugly使用步骤以及字符串的上传,

weixin_45958328的博客 1915

保姆级教程:在S32K312上配置C40驱动,实现Flash读写(基于RTD 4.4.2)

本文详细介绍了在S32K312微控制器上配置C40驱动实现Flash读写的全流程,基于RTD 4.4.2库。内容涵盖环境搭建、外设配置、Flash操作实战代码及高级应用场景,特别针对LLD驱动和FLS存储操作中的常见问题提供了解决方案,帮助开发者快速掌握嵌入式Flash存储技术。

weixin_28684757的博客 256

集成腾讯Bugly日志收集接入详细步骤和错误解决方案-- IOS

一、登录BUGLY官网1、登录BUGLY官网以后,选择新建产品,选择IOS或ADNROID平台,如图:完事以后点击保存,点击当前项目查看详细信息:主要有:异常上报(异常概览、崩溃分析、卡顿分析、高级搜索、异常配置)、运营统计(运营概览、用户分析、渠道分析)、应用升级2、选择右上角更多,点击产品设置,查看项目的APP ID和APP KEY,如图:3、下载SDK,选择右上角,SKD,NDK,...

Astor的专栏 1万+

『ISOBUS 入门』第 00 节 导言:ISOBUS 的宏观图景与入门路径

ISOBUS 是由三部分构成的集成系统:两段CAN网络(拖拉机与农具侧)、标准化通信约定及认证流程。其核心在于通过统一协议实现跨品牌设备即插即用。标准体系以ISO 11783为基础,分层涵盖物理层、传输层至应用层,关键功能如虚拟终端(VT)、任务控制器(TC)和文件服务器依赖严格的会话管理与角色分工。实际部署中,总线上传输多种协议报文,故障排查需结合地址声明、多包传输与角色权限分析。学习应从真实报文入手,建立“角色—数据流—功能块”认知链,避免仅学标准或仿真替代实测,方能有效应对复杂现场问题。

linx295的博客 282

C#实现跨域访问共享文件夹的账号密码验证方案

本文详细介绍了在C#中实现跨域访问共享文件夹的账号密码验证方案。通过调用Windows API LogonUser函数,结合LOGON32_LOGON_NEW_CREDENTIALS登录类型,可安全模拟指定用户身份,有效解决工作组与域环境间的文件共享访问难题。文章提供了完整的工具类封装、多种实战场景示例及详细的错误排查指南。

pea55的博客 540

iOS Bugly符号化使用分析

前言:一种愉快的开发方式,轻松快速定位BUG,跟开发中的BUG说再见!(公司里开展技术分享会,我就这对Bugly的使用做了个整理) Bugly使用分析 作者:tangjianfeng 时间:2018/10/23 腾讯Bugly简介: Bugly是腾讯公司为移动开发者开发的服务之一,是面向移动开发者提供专业的Crash监控,崩溃分析等质量跟踪服务。 Bugly能帮助...

weixin_30325487的博客 365

AI Agent辅助企业财务分析与预测

企业财务分析与预测是企业管理中至关重要的环节,准确的财务分析与预测能够帮助企业管理者做出明智的决策,合理规划资源,降低风险。然而,传统的财务分析与预测方法往往依赖于人工经验和简单的统计模型,存在效率低、准确性差等问题。随着人工智能技术的飞速发展,AI Agent作为一种智能的软件实体,能够自主地感知环境、做出决策并采取行动,为企业财务分析与预测带来了新的解决方案。

AI天才研究院 921

【亲测免费】 Bugly-iOS: 强大的iOS应用错误监控解决方案

Bugly-iOS: 强大的iOS应用错误监控解决方案 项目简介 是腾讯Bugly团队推出的一款开源错误监控工具,专为iOS开发者设计。它能够帮助开发者实时、精准地定位并修复应用程序中的运行时错误和异常,提升App的质量与稳定性。 技术分析 Bugly-iOS的核心技术包括: 异常捕获与处理:通过插入到应用程序代码中的钩子,Bugly能够在程序出现未捕获的异常时即时捕获,并记录详细的错误信息。 ...

gitblog_00082的博客 866

从镜头到像素:深入解析Camera、Sensor与V4L2的协同工作流

本文深入解析了摄像头从物理成像到软件控制的完整工作流。详细介绍了镜头、传感器(Sensor)与V4L2框架的协同机制,涵盖光电转换、同步信号、ISP图像处理等核心环节,并通过实战演示了如何使用v4l2-ctl工具进行调试,为嵌入式开发和驱动调试提供系统指南。

weixin_29230805的博客 389

RD算法(一)初出茅庐 —— 算法原理

在《SAR成像概述》的第4节已经对各种SAR成像算法进行了一个简要的概述,本文就直接从RD算法讲起了。

5288

Bugly并非无所不能

在 iOS 应用因为内存占用过大而被系统 killed 的情况下,Bugly 以及大多数崩溃报告工具是无法捕获到这种类型的崩溃信息的。原因在于,当系统由于内存压力过大而终止应用时,是直接将应用进程杀死,不会触发常规的崩溃处理流程,如 `NSUncaughtExceptionHandler` 或信号处理器。因此,应用没有机会执行任何代码来记录和上报崩溃信息。

侯仕奇的博客 1167

数据中台之流程引擎:Activiti工作流引擎详解

一. 简介 BPM: BPM规范及BPM软件 BPMN: Activiti 7 1.工作流俩种方式 1.状态值跟踪法 1.工作流软件 2.工作流引擎对比 1.Activiti 2.JBPM5 3.flowable 4.liteflow 3.步骤 1.部署Activiti 1.流程定义 1.流程定义部署 1.启动流程实例 1.任务查询代办 1.用户办理任务 1.流程结束 二. 核心 Activiti 基础架构.png Activiti 7大接口.png RepositoryService:提供一系列管理流

GIS摆渡人 1688

【BuglyIOS干货分享】iOS内存管理:从MRC到ARC实践

为什么80%的码农都做不了架构师?>>> ...

weixin_34092370的博客 143

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

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

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

iOS内存管理:从MRC到ARC实践

Bugly 技术干货系列内容主要涉及移动开发方向,是由 Bugly 邀请腾讯内部各位技术大咖,通过日常工作经验的总结以及感悟撰写而成,内容均属原创,转载请标明出处。 对于iOS程序员来说,内存管理是入门的必修课。引用计数、自动释放等概念,都是与C语言完全不同的。搞明白这些,代码才有可能不 crash。然而就是这么牛逼的内存管理,着实让我这...

weixin_33827731的博客 201

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

iOS 开发 腾讯bugly(上线后崩溃追踪)集成指南--2106最新版

iOS 开发 腾讯bugly(上线后崩溃追踪)集成指南–2106最新版首先要去腾讯开放平台注册APP 获取appid 和appkey 链接–腾讯bugly集成指南cocoapods集成1.Podfile文件##platform :ios, ‘8.0’target 'demo' do pod 'Masonry' pod 'AFNetworking' pod 'SDWebImage' pod 'SVP

高级软件开发工程师--周玉的博客 4879

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

iOS 快速定位线上bug,bug日志分析及bugly使用符号化精准定位bug

1.xcode 自带buy追踪 使用xcode自带追踪bugly需要用户与应用开发者共享崩溃数据 这时你可以在APPStoreConnect中APP分析中自选择日期查看线上app崩溃现状 通过xcode–>Window–>organizer 打开如弹窗 通过点击崩溃左侧箭头快速在xcode定位到崩溃的代码,但这种方法使用的局限就是需要用户协助给开发者分享崩溃日志。所以为了打破这种局...

弋小生的博客 3722

iOS集成Bugly详解

异常上报 SDK 集成 通过CocoaPods集成 新建项目 cd 项目目录 vim Podfile # source 'https://github.com/CocoaPods/Specs.git' inhibit_all_warnings! platform :ios, '7.0' target 'BuglyDemo' do pod 'ReactiveCoc...

十二指环的博客 6642

Bugly不认真看文档,遇到的坑

腾讯bugly 统计crash 不认真看文档,搞得我找个bug找了两天,无意发现的。爱偷懒,不把文档认真看,直接集成,害的自己看bugly上面的一个bug找了好久,最主要是定位不到到底是哪里出问题。项目植入bugly 和其他三方流程大致,非常简单。这里就不说了。 https://bugly.qq.com/getStarted我把bugly植入后。用Xcode 无论是release模式和dubug

码界颓废吴彦祖的博客 1万+

ios Bugly使用简介

转载地址:http://www.jianshu.com/p/846412365179 初始化 初始化需要一个AppId,在Bugly上新建一个应用就可以获取对应的AppId了;初始化Bugly也很简单: - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)

zwl492454828的专栏 2684

搜索问答技术概述:基于知识图谱与MRC的创新应用

研究问答系统在各领域的需求类型,处理多样数据源和不同文本形态的能力。关键技术包括基于知识图谱的KBQA和基于深度学习的DeepQA。KBQA重点在结构化数据上,而DeepQA结合了搜索和机器阅读理解,适用于更广泛非结构化数据。探讨了短答案和长答案机器阅读理解,面对挑战如搜索结果噪声和常识性错误。文章旨在提供深入了解问答系统技术和应用领域的资源。

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 11万+

[IOS笔记][Bugly]首次使用bugly收集app崩溃信息

环境介绍:Xcode8.0+真机ipone5(没有真机,用模拟器应该也可以) 【1】加载腾讯第三方框架Bugly 加载方式:通过podfile配置   pod ‘Bugly’ target ‘LogBugly’ do pod 'AFNetworking','~>3.1.0’ pod ‘CocoaLumberjack’,’~>3.2.1’ pod ‘MJExtension’

mashang123456789的专栏 2152

【IOS自动化解放双手系列三】上传bugly

开始我们先讲讲为啥上传bugly。开发过程中qa总会说这个地方蹦了 那个界面蹦了 但是他也不知道为何蹦,牛逼的QA会给你提供log日志。但是这样的QA可遇不可求。上线之后用户说使用情况你更无法得到,所以一切还是自己来吧。及早的接入对你的项目有好处。我不是做广告啊。 具体如何接入游戏腾讯已经做的很方便了 。 地址如下:https://bugly.qq.com/v2/ 我们今天说上传符号表部分,...

游戏小土匪 744

iOS之Bugly上传符号表

前提条件:Mac中需要先安装java环境,只支持jdk1.8.0,终端输入:java -version 看看版本号是多少 1.在bugly官网下载符号表上传工具 2.桌面新建一个文件夹名字可以随便起,将其下载的符号表工具中的jar放入该文件夹下, 我这边文件名是appdsym 3.在Xcode->Window->Organizer里面寻找到打包好的文件,右键显示包内容,在dSYMs文件夹里面找到工程的dSYM文件,拷贝复制到文件夹appdsym里面 4.终端...

qw656567的博客 2571
上一篇: 【Bugly安卓开发干货】Android APP 快速 Pad 化实现
下一篇: 【重磅推荐】2015年腾讯移动应用质量大数据报告
腾讯Bugly
博客等级 码龄12年 1875粉丝 201原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值