Leon’s Blog

Dreams don't work unless you do.

解决NSTimer内存泄露的巧妙方式

在使用NSTimer的过程中可能会遇到控制器明明销毁了,但是就是不会走控制器的dealloc销毁方法,NSTimer也没有停止运行,这就说明在使用NSTimer过程中出现了循环引用导致的内存泄露问题,在stackoverflow上看到了一种巧妙的方式解除这种循环引用,在此记录一下。

发生内存泄漏的场景

例如我们在viewController中声明了NSTimer属性,然后在viewDidLoad中去创建一个NSTimer实例赋值给myTimer,让它在dealloc方法中对myTimer进行销毁操作(我们只考虑在dealloc方法中对其销毁):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@interface ViewController ()
@property (nonatomic, weak) NSTimer *myTimer;
@end

- (void)dealloc {
[_myTimer invalidate];
}

- (void)viewDidLoad {
[super viewDidLoad];

self.myTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(logTime:) userInfo:@"打印log" repeats:YES];

}

- (void)logTime:(NSTimer *)timer {
NSLog(@"%@", timer.userInfo);
}

NSTimer与RunLoop的那些事

在项目中我们经常会用到定时器(NSTimer)的定时执行任务功能,虽然它的用法很简单内部却暗藏玄机,如果不搞懂它的工作原理很容易埋下许多坑,在这里详细记录一下。

NSTimer & RunLoop

首先NSTimer之所以可以定时去执行任务,实质上是被当前的Runloop驱动的,如果没有Runloop那它就不能运作,所以当我们让NSTimer定时处理事情的时候,要记得将NSTimer添加到了当前的Runloop中,Runloop会获取到NSTimer每一个时间间隔的时间,然后依次去执行我们的事件方法。如果不太明白RunLoop运行机制的童鞋,请戳这里

制作.bundle文件

在我们使用第三方框架时经常会看到xxx.bundle的文件,我们找到该文件,右键显示包内容,会看到很多图片,配置文件,.xib等资源文件。在我们SDK打包的过程中,也会将资源文件一并打包成.bundle文件使用,那是为什么呢?其实.bundle文件与我们平时的文件夹并无太大区别,在我看来只是加了后缀罢了,它更像是一个包,如果在工程外部想查看内部的文件需要显示包内容查看,在移动包文件的过程中在一定程度上也降低了他人对包内容误改的几率。

什么是bundle文件?

简单理解,就是资源文件包。我们将许多图片、XIB、文本文件组织在一起,打包成一个Bundle文件。方便在其他项目中引用包内的资源。

iOS打包静态库(二)

上一篇主要是介绍打包.a静态库的一些操作,这一篇主要介绍一下打包.framework流程。
在接下来介绍的过程中,相信你也会慢慢体会到.framework和.a在实际应用中的关系是什么,了解了它们的关系后我们会对.framework如何打包成.a和.a如何打包成.framework进行说明,最终决定将你们的项目部分组件或功能模块打包成.framework形式的静态库比较好还是.a形式的静态库比较好由个人喜好而定,区别不大,本人更喜欢使用.framework静态库,相对来说更方便一些,不用再去管那些.h文件应该放在哪里。


第一步,新建打包.framework的项目

iOS打包静态库(一)

前段时间由于工作的调动,接触到了游戏SDK的开发工作,最终要打包成静态库供游戏商使用,在这里做下记录。

为什么要打包成静态库?

举个栗子,比如支付宝,百度地图SDK中,他们仅仅是给我们暴露出来了.h文件中的接口,具体的实现隐藏到了静态库中,因为他们不想让别人拿到自己公司私密性的内容,这就是静态库的作用(使用场景)。

什么是库?

库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行。库分静态库和动态库两种。
iOS中的静态库有 .a 和 .framework两种形式;动态库有.dylib 和 .framework 形式,后来.dylib动态库又被苹果替换成.tbd的形式。

静态库和动态库的介绍

  • 静态库:静态库即静态链接库(Windows下的.lib,Linux 和 Mac 下的.a。之所以叫做静态,是因为静态库在编译的时候会被直接拷贝一份,复制到目标程序里,这段代码在目标程序里就不会再改变了。
    静态库的好处很明显,编译完成之后,库文件实际上就没有作用了。目标程序没有外部依赖,直接就可以运行。当然其缺点也很明显,就是会使用目标程序的体积增大。

NSAttributedString的基本用法和特殊处理

第一篇技术博客就从最近遇到的一个小问题着手吧,顺便也来复习一下NSAttributedString的基本用法。

NSAttributedString

NSAttributedString叫做富文本,是一种带有属性的字符串,通过它可以轻松的在一个字符串中表现出多种字体、字号、字体大小等各不相同的风格,还可以对段落进行格式化。

富文本分为不可变(NSAttributedString)和可变(NSMutableAttributedString)两种类型,两者的区别在于初始化完成后可变类型可以对其内部的值进行修改操作(即:覆盖,插入,删除字符串等操作), 而不可变类型则反之。
由于NSAttributedString类型方法比较局限,我们直接创建继承自它的NSMutableAttributedString类型对象

开启博客之旅

年前就开始着手搭建个人博客,无奈中途项目开工一直忙到了现在,再整理的时候发现遗忘的差不多了,只能重新来过,虽然有点曲折,但总算是完工了,还是值得开心纪念一下,哈哈!
创建博客的初衷是想整理一些在项目中遇到的实际问题和对自己一段时间的技术总结。

加油!做一只有梦想的Coding Dog!