Lemon's blog

所有的东西你都要坚持到最后才知道值不值得


  • 家

  • 归档

  • 分类

  • 标签

  • 搜索

Runtime防止Crash(unrecognized Selector sent to instance篇)

发表于 2019-04-14 | 分类于 iOS 开发 |
字数统计: 1,998 | 阅读时长 ≈ 8

我相信对于所有的iOSer来说,最恐怖的就是线上的crash了。对于有(mei)强迫(you)症(qian)的我来说,只要一发现有crash,只要条件允许,无论是在凌晨三点还是在晚上十二点,我都会立刻拿出电脑来查找原因看看是哪里导致的crash。所以为了让程序不要crash,我们有两种方法,一种是预防,一种是补救。

今天我们的重点是预防,至于补救我在之前的一篇文章中有说过,大体就是通过上传crash堆栈信息,或者通过xcode拿到log,然后通过符号表还原定位到crash的代码。具体的可以看iOSCrash信息上报和处理

阅读全文 »

逆向微信根据手机号码搜索联系人获取WXID

发表于 2019-04-02 | 分类于 iOS 逆向 |
字数统计: 2,224 | 阅读时长 ≈ 11

这段时间在忙着新版本SDK的开发,也在准备换工作的事情,虽然现在是“寒潮”,但是还是想走出舒适区,去感受一下春天的“寒冷”。也很久没有接触逆向方面的工作了,昨天一个大学同学问我,能不能通过一个人的手机号以及微信号找到那个人对应的wxid,其实我也不清楚,但是我们来尝试一下找一下。

1. wxid 是什么?

wxid是顾名思义就是微信的ID,也就是一个手机号码刚注册的时候,微信给予用户的一个初始化ID,这个和后面的微信号其实是分开的,经过我测试,如果设置了微信号之后,可能原始的wxid就会被覆盖。但是也有一些是不会被覆盖的,这个就不清楚微信是怎么处理的了。

阅读全文 »

iOS中常见的八种锁

发表于 2018-10-31 | 分类于 iOS 开发 |
字数统计: 2,458 | 阅读时长 ≈ 9

为什么需要锁

在iOS中相信大家都用过多线程,多线程带来的好处显而易见,但是我们需要关注一下多线程有可能带来的问题。假设我们有一个这样的场景,我们有两条线程A和线程B,A线程做的事情是修改这个对象之后读取这个对象的数据,这个时候B线程可能也在修改这个对象。这个时候有两种情况(取决于B线程修改对象的时机):

  1. 正常的情况,A线程修改对象以及读取对象之后,B线程才开始修改这个对象。
  2. 异常的情况,A线程修改对象之后,B线程立刻修改了这个帝乡,然后A线程读取对象。这个时候A线程读取到的数据就出错了。

这就是我们常说的Data race,当两个线程同时在访问修改同一个块内存的时候,就有可能得到意想不到的结果。

阅读全文 »

iOS动手实现KVO

发表于 2018-10-10 | 分类于 iOS 开发 |
字数统计: 1,377 | 阅读时长 ≈ 6

什么是KVO

KVO(key-value observing)是观察者模式的一种实现,通过监听对象的某一个属性,当属性的值发生改变的时候,监听者会获得通知。

KVO的使用以及缺点

我们来看一下是如何使用系统的KVO的。
系统提供了三个重要的方法,一个是设置监听,一个是监听回调,另外一个是移除监听。

阅读全文 »

atomic是不是线程安全的

发表于 2018-09-30 | 分类于 iOS 开发 |
字数统计: 1,962 | 阅读时长 ≈ 7

什么是线程安全

我们先来看看什么叫做线程安全。

如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。
或者说:一个类或者程序所提供的接口对于线程来说是原子操作或者多个线程之间的切换不会导致该接口的执行结果存在二义性,也就是说我们不用考虑同步的问题。

阅读全文 »

iOS中的load和initialize方法

发表于 2018-09-11 | 分类于 iOS 开发 |
字数统计: 3,294 | 阅读时长 ≈ 15

前言

我们知道在NSObject中有两个初始化的方法,+(void)load以及+ (void)initialize方法,这两个方法都是由系统来自动调用,不需要我们手动来调用,我们经常会在这两个方法的内部做一些magic的事情。

下面我们首先对这两个方法做一个初步的使用,看看他们两的调用时机以及异同。

当然如果已经知道了他们的异同以及调用顺序的可以直接看总结或者源码分析

阅读全文 »

iOS图片解码实践

发表于 2018-09-04 | 分类于 iOS 开发 |
字数统计: 1,451 | 阅读时长 ≈ 6

前言

在iOS中,大多数的APP都有不可或缺的图片资源,同时也很容易因为对图片的处理不恰当造成性能低下,不要让图片成为你的APP的性能杀手。

一张图片从磁盘中加载出来,同时显示到屏幕上,经过了一系列的复杂处理,其中包括了对图片的解码,我们今天就来做一次图片的解码实践。

图片显示过程

平时我们对于图片的显示,一般都是使用以下的代码:

1
2
UIImage *image = [UIImage imageNamed:@"icon"];
self.imageView.image = image;
阅读全文 »

你看那个程序员,他孤不孤独

发表于 2018-08-31 | 分类于 杂谈 |
字数统计: 2,032 | 阅读时长 ≈ 7

今天是星期五,对于大多数人来说估计已经在琢磨着周末去哪里浪了,或者周末在家睡个天昏地暗,享受一下这难得不用早起挤车挤地铁的周末。

龙哥看看手表,凌晨四点整,刚吃完酸菜牛肉面的龙哥打算下班回家。这已经是龙哥这周第三次加班到凌晨了,只有星期二的时候休息了一天没加班,因为项目快要上线了,估计周末还得在办公室度过。

作为“资深”程序员的龙哥虽然才工作三年多,但是已经有五年的工作经验了。如果是同行的话估计会懂这句话是啥意思,那多出来的一年半的工作经验就是加班多出来的。

阅读全文 »

iOS中的圆角处理(终结篇)

发表于 2018-08-29 | 分类于 iOS 开发 |
字数统计: 1,753 | 阅读时长 ≈ 7

前言

在开发中,我们经常用到圆角的处理,圆角看起来会比直角更加美观和柔美。但是设置圆角往往会带来一定的性能损耗,损耗的来源主要由于大量的离屏渲染,接下来我们就来讲一下如果实现高性能的圆角。我们下面来看以下几种设置圆角的方式以及它们对性能的影响。

CornerRadius+masksToBounds

第一种方式就是我们最常用的设置圆角的方式,我们首先来看看cornerRadius的定义是什么:

The radius to use when drawing rounded corners for the layer’s background. Animatable.
Setting the radius to a value greater than 0.0 causes the layer to begin drawing rounded corners on its background. By default, the corner radius does not apply to the image in the layer’s contents property; it applies only to the background color and border of the layer. However, setting the masksToBounds property to YES causes the content to be clipped to the rounded corners.
The default value of this property is 0.0.

阅读全文 »

Runloop黑魔法之复活APP

发表于 2018-08-23 | 分类于 iOS 开发 |
字数统计: 710 | 阅读时长 ≈ 3

Runloop黑魔法之复活APP

看到这个标题是不是觉得很酷炫,但是我还要是解释一下标题是什么意思,以免有人说我标题党,我现在要做的就是当APP发生Crash的时候,不要让APP闪退,而是重新复活。

换句话可以这么形容,把一个Crash信息吞掉,大家当没事发生过。

说得这么牛批,这个东西有什么实际的用处呢?额,其实还真的没啥实际的用处,不过我们当发生异常信息的时候可以友好的弹一个框告诉用户当前发生了异常,是选择上传异常信息继续运行还是直接退出,当然继续运行依然会有Crash风险。

接下来我们就来实现这么一个事情吧。

阅读全文 »
12…5
lemon

lemon

iOS Developer | 拥抱变化 | 🍋😊

50 日志
5 分类
41 标签
RSS
GitHub E-Mail
© 2019 lemon