iOS中的多线程和锁
在 ibireme 的 不再安全的 OSSpinLock 一文中,有一张图简单比较了各种所的加锁性能 下面根据顺序分析每个加锁的实现原理。注意:加解锁速度并不表示锁的效率,只表示加解锁的操作在执行时的复杂度。
锁之间的关系
忙等类
test_and_set -> OSSpinLock -> os_unfair_lock
休眠类
lll_futex_wait -> GCD信号量
lll_futex_wait -> pthread_mutex
1.加上错误处理 -> NSLock
2.加上条件判断 -> NSCondition + Value -> NSConditionLock
3.加上递归特性 -> NSRecursiveLock
4.加上递归特性、哈希特性 -> @Synchronized(Obj)
Read More...隐私政策
隐私政策:
本应用不会收集任何用户个人信息,请放心使用。
另外在未征得您事先许可的情况下,本应用不会将获取到的设备信息对外披露或向第三方提供。
本应用会不时更新本隐私权政策。 您在同意本应用服务使用协议之时,即视为您已经同意本隐私权政策全部内容。
本隐私权政策属于本应用服务使用协议不可分割的一部分。
title: Mapkit基本开发指南
date: 2018-07-27 14:29:49
categories: iOS
tags: Mapkit
MapKit是iOS自带的地图库。可以实现定位,地理编码,地图标注等功能。
Read More...YYCache 源码解析
YYCache 源码解析
YYCache是国内开发者ibireme开源的一个线程安全的高性能缓存组件,代码风格简洁清晰,在GitHub上已经有了1600+颗星。
阅读它的源码有助于建立比较完整的缓存设计的思路,同时也能巩固一下双向链表,线程锁,数据库操作相关的知识。如果你还没有看过YYCache的源码,那么恭喜你,阅读此文会对理解YYCache的源码有比较大的帮助。
Read More...iOS底层原理总结 - 关联对象实现原理
iOS底层原理总结 - 关联对象实现原理
面试题
问: Category能否添加成员变量?如果可以,如何给Category添加成员变量?
答:不能直接添加成员变量,但是可以通过runtime的方式间接实现添加成员变量的效果。
Runtime为Category动态关联对象
使用RunTime给系统的类添加属性,首先需要了解对象与属性的关系。我们通过之前的学习知道,对象一开始初始化的时候其属性为nil,给属性赋值其实就是让属性指向一块存储内容的内存,使这个对象的属性跟这块内存产生一种关联。
那么如果想动态的添加属性,其实就是动态的产生某种关联就好了。而想要给系统的类添加属性,只能通过分类。
这里给NSObject添加name属性,创建NSObject的分类 我们可以使用@property给分类添加属性
1 | @property(nonatomic,strong)NSString *name; |
通过探寻Category的本质我们知道,虽然在分类中可以写@property 添加属性,但是不会自动生成私有属性,也不会生成set,get方法的实现,只会生成set,get的声明,需要我们自己去实现。
Read More...
iOS底层原理总结 - Category的本质
iOS底层原理总结 - Category的本质
面试题
- Category的实现原理,以及Category为什么只能加方法不能加属性。
- Category中有load方法吗?load方法是什么时候调用的?load 方法能继承吗?
- load、initialize的区别,以及它们在category重写的时候的调用的次序。 Read More...
iOS底层原理总结 - RunLoop
iOS底层原理总结 - RunLoop
面试题
- 讲讲 RunLoop,项目中有用到吗?
- RunLoop内部实现逻辑?
- Runloop和线程的关系?
- timer 与 Runloop 的关系?
- 程序中添加每3秒响应一次的NSTimer,当拖动tableview时timer可能无法响应要怎么解决?
- Runloop 是怎么响应用户操作的, 具体流程是什么样的?
- 说说RunLoop的几种状态?
- Runloop的mode作用是什么?
iOS底层原理总结 - 探寻Class的本质
iOS底层原理总结 - 探寻Class的本质
对小码哥底层班视频学习的总结与记录。面试题部分,通过对面试题的分析探索问题的本质内容。 上接 iOS底层原理总结 - 探寻OC对象的本质
Class的本质
我们知道不管是类对象还是元类对象,类型都是Class,class和mete-class的底层都是objc_class结构体的指针,内存中就是结构体,本章来探寻Class的本质。
1 | Class objectClass = [NSObject class]; |
点击Class来到内部,我们可以发现
1 | typedef struct objc_class *Class; |
Class对象其实是一个指向objc_class结构体的指针。因此我们可以说类对象或元类对象在内存中其实就是objc_class结构体。
我们来到objc_class内部,可以看到这段在底层原理中经常出现的代码。
1 | struct objc_class { |