自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(45)
  • 资源 (1)
  • 问答 (1)
  • 收藏
  • 关注

原创 iOS修改外部符号指针地址—fishhook原理

以上就是fishhook的原理,具体操作可以看源码。

2024-04-16 13:00:38 245

原创 iOS最新外部符号加载

非懒加载会将外部函数替换成一个桩函数,桩函数保存在,桩函数指令是取出段指定位置的值,然后跳转到该地址。保存非懒加载符号,会在启动时写入对应外部函数的具体地址。懒加载现在跟非懒加载一样,只是外部符号位置保存在。调用未定义的函数会走,但实际上会走终止程序,也就是说现在不存在实际意义的懒加载了。

2024-04-16 12:12:05 991

原创 iOS 启动速度优化

点击App后到首帧显示耗费的时间。:premain、postmain,也就是main函数执行前和main函数执行后。

2024-04-11 11:53:41 346

原创 iOS 二进制重排

早,所以无法监听到,这个可以扫描mach-o文件查看哪些类有load,直接加上去。原理:减少page fault次数,将启动用到的代码都放到一个page里。在build setting->Order file指定文件路径。收集到符号信息后,可以把符号分行书写到自定义的order文件。,C/C++/OC/block代码都能调试到。,info.dli_sname会少一个下划线。开头可以直接写入,其他的要额外加一个下划线。func可以换成edge和bb。Other C flag里加上。统计启动过程中用到的函数。

2024-04-08 23:18:30 415

原创 iOS自定义初始化方法

所以可以通过声明全局或者静态指针变量,去持有这些函数,把这些指针放到__DATA里自定义的一个段里,因为指针大小都是8字节,每次跳8字节就能访问到下一个指针了。有很多初始化方法我们通常都是在applicationDidFinishLaunching里一个个调用,那么有没有办法像。这样声明函数和变量太麻烦了,我们可以使用宏来帮忙。

2024-04-08 23:09:50 484

原创 hdiutil打包dmg

【代码】hdiutil打包dmg。

2024-04-08 13:30:42 343

原创 如何调试Clang源码

这个就直接去LLVM官网下载,然后编译好Clang就行,注意得debug模式,保存符号信息。

2024-03-28 17:20:13 580

原创 iOS Mach-O文件是否有调试信息

无法确认是否有调试信息。最后我是通过这个命令来确认的,这也能用来导出dSYM文件。可执行文件和动态库这种链接过的文件,其__DWARF段合并到了符号表里,命令。静态库这种未链接的文件里有__DWARF段,可以直接用命令。

2024-02-28 17:33:59 431

原创 iOS崩溃之dispatch_async

先直接上堆栈一看到这种堆栈就头痛,但最近正好在学习Apple源码阅读,所以还是静下心来仔细分析。从堆栈来看,crash的原因应该就是被调用了。再看是调用的,该方法常出现在中,被RunLoop调用,所属的库是libdispatch.dylib。在下载libdispatch,搜索这里应该就是传过去的block,底下的很明显就是造成崩溃的直接原因。而这里被try-catch包裹,那么崩溃的原因已经很明显了,block方法里抛出异常被捕获,触发造成崩溃。

2024-02-28 17:22:10 479

原创 iOS——从静态库到分类加载-ObjC

链接.a时,用到里面哪个.o的符号,对应.o里的所有符号就都会链接进来,没有的.o就不会被链接进来。合并.o可以缩小体积,但是会导致所有符号都链接。静态库有分类要加-ObjC的原因是,分类和主类在两个.o里,分类的符号没有被引用到,所以分类.o没有被链接。

2023-04-07 17:13:31 439

原创 iOS 静态库.a文件结构

a是.o文件的压缩。都是Header+Member。.a总体结构如下,第一组比较特殊。第二组开始代表里面的一个个.o文件标识符Member(1)Member(2)

2023-04-07 17:11:49 512

原创 iOS 多个动态库依赖相同静态库问题

一.背景最近遇到一个问题,如下。objc[18116]: Class GPBBoolBoolDictionary is implemented in both xx/QLVPlatformFramework (0x1113481b0) and xx/QLVEngineFramework (0x10fde7108). One of the two will be used. Which one is undefined.问题很简单,是一个类在两个动态库都有实现。搜一下这个类,是一个静态库的,l

2022-03-29 19:10:08 1756

原创 iOS block循环引用问题深究

对象A持有对象B,调用B的block参数方法,在里面使用了self。在使用block我们都会默认在里面使用weakself,网上搜了很多解释都是为了防止循环引用,以防self被持有导致内存泄露。那么问题来了,到底是谁持有了self?我以前没有深究,一直以为是A和B互相持有导致的循环引用。但是最近正好有重新深究block,于是便想着从block里找到答案。首先写一段代码,将其从oc转换成c++@implementation C-(void)tes...

2022-03-29 19:07:07 2370

原创 iOS: ScrollView实现TableView的Cell复用机制

回收当botOfTop或者topOfBot出了ScrollView的范围复用当topOfTop或者botOfBot进了ScrollView的范围代码头文件因为cell都是LabelView,所以就不用用户创建返回。@protocol NewScrollViewDelegate <NSObject>- (NSInteger)countOf...

2020-03-29 15:30:44 402

原创 iOS实现滑动嵌套

iOS实现滑动嵌套上下滑动嵌套层级底下是一个TableView;红色的是tableView.tableHeaderView;绿色的是- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section方法返回;最底下的是一个自定义ScrollView(因为还要实现左右滑动);...

2020-03-18 10:40:42 941

原创 Android热修复之代码修复原理(类加载方案)

这个方案是基于Android的类加载机制PathClassLoader负责加载Android的系统类和你自己定义的应用程序类;DexClassLoader负责加载任意目录下的dex和zip、jar、apk内的dex文件;PathClassLoader0和DexClassLoader都继承自BaseDexClassLoader,这两者类似,只是增加了调用父类构造函数的构造函数。所以功能不同只是...

2019-05-23 19:58:19 242

原创 Android EventBus源码解析

1.EventBus.getDefault().register(this);public static EventBus getDefault() { if (defaultInstance == null) { synchronized (EventBus.class) { if (defaultInstance =...

2019-05-23 15:11:55 117

原创 Android AsyncTask源码解析

由于AsyncTask是抽象类,所以必须要有子类继承,下面是它的构造函数://1public AsyncTask() { this((Looper) null); }//2public AsyncTask(@Nullable Handler handler) { this(handler != null ? handler.getLooper()...

2019-05-12 12:43:59 135

原创 Retrofit详解:新手学习

这是我在学习Retrofit时为了理解写下来的,写的很详细,如果你是对Retrofit不了解,请一定从头到尾耐心地读下来。我在遇到一个方法是,常常会一直深入下去,所以往往结果就是深入结束后都忘记从哪儿开始的了,所以请耐心地回头看看。> 一.创建RetrofitRetrofit retrofit=new Retrofit.Builder() ...

2019-04-18 20:20:09 993

原创 OkHttp源码简单解析

使用流程1.创建OkHttpClient对象默认直接new OkHttpClient()创建,其实内部是通过一个建造者模式创建的,使用默认配置。2.发起Http请求Requst通过Request.Builder()创建,client.newCall(Request)返回一个call,newCall()返回的是一个RealCall对象。Call的execute()是同步方法,enque...

2019-04-16 14:10:20 188

原创 TCP/IP协议详解

TCP/IP模型层次应用层:Http、FTP协议 传输层:TCP/UDP协议 网络层:IP协议,负责对数据加上IP地址和其他的数据以确定传输目标 网络接口层:以太网协议数据链路层 三个基本问题:封装成帧、透明传输、差错检测。 封装成帧:把网络层数据报加头和尾,封装成帧,帧头中包括源MAC地址和目的MAC地址。 透明传输:零比特填充、转义字符。 透明传输是指不管...

2019-03-22 14:31:36 505

原创 二叉树非递归遍历

先序遍历先序遍历顺序:中左右首先构造一个栈,将根节点压入栈。然后弹出栈顶部元素,打印输出,再压入弹出元素的右儿子和左儿子(注意顺序)。这时再开始循环,弹出栈顶元素,打印输出,再压入弹出元素的右儿子和左儿子,直到最后栈元素为空 public void before(Node root) { if(root==null) return; Stack&lt;N...

2019-03-07 15:18:46 2347 1

原创 JVM对象回收算法

回收算法引用计数法每个对象含有一个引用计数器,每当被引用计数器值就加1;当引用失效,计数器值减1。但是该方法会有循环引用问题,如果对象A、B互相引用,然后A、B=null,这时虽然A、B引用失效,但是由于仍然相互引用,内部计数器值不为1,所以无法回收。所以JVM使用的并不是引用计数法。可达性分析算法将一系列称为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,走过的...

2019-03-02 23:12:33 181

原创 String创建难点和intern

1.String a="ab",String b="ab",a==b结果:trueString储存在常量池,创建时先查看常量池,如果有则返回引用,没有则创建新的,所以相等。2.String a="ab",String b="a"+"b",a==b结果:true编译时会省略+号,相当于String b="ab"3.String a="ab

2019-03-01 19:47:41 137

原创 Android打开相册获取图片路径

一.获得图片路径当我们通过Intent打开相册,获取图片后,在onActivityResult回调中会得到图片的Uri。但是Uri无法直接获得图片的路径。如果你曾经直接操作过android里的数据库的话,应该明白,Uri可以通过ContentResolver获得数据库表里的数据。例如:content://com.android.providers.media.documents/docum...

2019-02-15 12:24:59 5019

原创 实现自定义欢迎页右上角加载进度条

话不多说先看图具体参看Github地址:https://github.com/lixido159/circle_progress

2019-01-02 22:18:50 170

原创 Android NestedScrolling中RecyclerView滑动底部空白显示

http://blog.csdn.net/lmj623565791/article/details/52204039 这篇文章介绍了NestedScrolling机制的使用,但是实际使用的时候会出现上滑时,recyclerView底部显示空白。这是因为scrollBy()方法将整个镜头往下移动,但是整个视图只绘制了屏幕,底部多出来的部分是空白。我这里有个简单的方法,就是在实现Ne...

2018-12-22 19:30:40 4137

原创 Android Activity四种启动模式简单解释

Activity是被存放在一个任务栈内的,实现的是后进先出。如果一个Activity被压在栈底,这时候要打开它,是把已有的拿上来还是新建一个呢?这就要用到我们的启动模式 (1)standard:不管有没有,直接创建一个新的(2)singleTop在栈顶就用原来的,不新建。如果在栈底就新建。(3)singleTask在指定的任务栈创建,如果当前没有创建过就新建,如...

2018-10-11 21:17:43 127

原创 Android MVP模式简单例子

MVP模式就是M(Model)、V(View)和P(Presenter)Model就是数据,怎样获得数据、数据的类型都属于Model,总之就是所以跟数据有关的类和操作都属于ModelView就是展示给用户的界面,包括各种控件、处理点击事件都属于View,在Android中,往往Activity、Fragment都属于ViewPresenter就是一个中介,View不直接操作数据,而是通...

2018-10-10 23:35:27 338

原创 Android 布局动画LayoutAnimationController与LayoutTransition

1.LayoutAnimationControllerLayoutAnimationController可以看做是进场动画,作用的范围是某个ViewGroup的所有子View。1.layout_anim.xml&lt;?xml version="1.0" encoding="utf-8"?&gt;&lt;set xmlns:android="http://schemas.android.com/...

2018-04-29 12:52:32 320

原创 Android PorterDuffXferMode与实现刮刮卡效果

1.PorterDuffXferMode在实现刮刮卡效果之前,我们需要首先了解一下PorterDuffXferMode上面就是十六种PorterDuff.Mode,但如果你试过就知道,其实并非完全如上面一样。原因就是,上面的圆形和矩形并不是整个Bitmap,整个方框才是Bitmap。圆形和矩形只是画在里面的,而且那两个Bitmap是完全重叠的,只是里面的图形位置不同。就像是我画的这个图,整个图形不...

2018-04-25 08:59:52 210

原创 ViewDragHelper详解及实现QQ聊天信息侧滑

    ViewDragHelper通常是在自定义的ViewGroup中使用,通过ViewDragHelper,我们可以很方便的实现ViewGroup中子View的滑动。    ViewDragHelper有几个常见的方法: ViewDragHelper dragHelper=ViewDragHelper.create(this, new ViewDragHelper.Callbac...

2018-04-18 22:48:26 219

原创 Android实现自定义滑动选择器

自定义一个滑动选择器首先需要自定义一个Java类,在这里将其命名为TestScroller,让其继承View,实现所有的构造函数,如下图public class TestScroller extends View{ public TestScroller(Context context) { super(context); } public TestScr...

2018-04-13 09:44:52 5828 1

原创 实现ViewPager的Fragment之间切换动画

整体思路:创建一个类MyPagerTransition 实现ViewPager.PageTransitionpublic class MyPagerTransition implements ViewPager.PageTransformer{ @Override public void transformPage(@NonNull View page, float positi...

2018-03-05 10:00:18 2506

原创 FloatingActionButton 下滑隐藏,上滑显示

先上效果图整体思路:1.Fab需要作为CoordinatorLayout的子控件2.设置好动画,分别隐藏和显示Fab3.自定义MyBehavior类,继承FloatingAcitionButton.Behavior,重写方法public boolean onStartNestedScroll(@NonNull CoordinatorLayout coordinatorLayout, @NonNul...

2018-03-04 22:35:06 2845

原创 ViewPager动态加载Fragment

整体思路:1.添加控件ViewPager2.创建fragment--BlankFragment3.在BlankFragment的java文件内创建静态方法newInstance(int id),返回值为Fragment    Bundle bundle=new Bundle();    bundle.putInt("id",id);    BlankFragment fragment=new ...

2018-03-04 10:30:28 2889

原创 Android Shared Element Transition

要想实现Shared Element Transition需要实现以下几点·设置共享视图在layout布局文件内,为需要实现该功能的View加上android:transitionName=""假设从活动A跳转到活动B,那么A、B需要共享的View都需要在布局文件内加上一样的名字·启动活动 Bundle bundle= ActivityOptions.makeSceneTransitionAni...

2018-02-08 22:57:58 436

原创 Android Content Transition界面切换

Android的Activity/Fragment切换有两种方式不带共享元素:Content Transition带共享元素的:Shared Element Transition刚刚整理了一下Content Transition,记录一下自己的所得要实现Content Transition分为下面几步·在style.xml添加  &lt;item name="android:windowActiv...

2018-02-08 16:19:47 567

原创 android动画之TransitionManager

TransitionManager用于Scene场景之间的过渡Scene储存着一个根View下的各个View的属性,例如下图就是一个场景场景过渡有两个触发方式 go() 和 beginDelayedTransition()常见的过渡效果有Fade Slide Explode ChangeBoundsgo()使用该方法是进行两个布局之间的切换,提前设置好两个布

2018-02-07 15:04:56 4777

原创 CoordinatorLayout搭配CollapsingToolbarLayout实现酷炫的效果

我们来分析下代码<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://sch

2017-12-29 13:17:06 388

自定义滑动选择器简单示例

一个实现Android自定义滑动选择的简单Demo,简单、可读性强,但只有简单的注释

2018-04-13

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除