ios
文章平均质量分 90
Real小龙
个人总结
展开
-
多线程之GCD(上)
多线程之GCD(上)进程和线程GCD源码解析GCD进程和线程什么进程呢?进程是指在系统中正在运行的一个应用程序,也就是我们开发的每一个APP。每个进程之间是独立的,并且每个进程均运行在其专用的且受保护的内存空间内。通过“活动监视器”可以查看 Mac 系统中所开启的进程。那什么事线程呢?线程是进程的基本执行单元,一个进程的所有任务都在线程中执行。进程要想执行任务,必须得有线程,进程至少要有一条线程。程序启动会默认开启一条线程,这条线程被称为主线程或 UI 线程。进程和线程有什么关系呢?一个线程可以原创 2022-05-30 15:42:11 · 339 阅读 · 0 评论 -
objc_msgSend探究
objc_msgSend探究objc_msgSend的引入self和super方法的快速查找方法的慢速查找objc_msgSend的引入首先还是从代码开始说起:LLPerson *p = [LLPerson alloc];[p test];[p test1:@"LL"];我们通过命令行clang -rewrite-objc main.m去编译main.m文件,得到main.cpp文件,在main.cpp文件中,我们查找main函数。int main(int argc, const char原创 2022-05-24 01:01:00 · 486 阅读 · 0 评论 -
方法缓存cache_t
方法缓存cache_tcache_t的结构cache_t的insert初始化和扩容真正的插入操作bucket_t和bucketscache_t的结构前面我们探究了class_data_bits_t,接下来我们探究cache_t这个结构,作为方法缓存,它的结构是什么样的呢?插入方式是什么样的呢?我们从源码看一下它的结构:// objc-runtime-new.h// returns: //如果没有缓存值,则缓存的IMP为nil,如果没有缓存值且缓存已预优化,则缓存为动态' value_on_const原创 2022-05-19 22:46:11 · 433 阅读 · 0 评论 -
类的底层探索(下)
类的底层探索(下)类中的成员变量rw ro rwe类中的成员变量从前面的分析中我们知道,我们在rw中读取到了方法列表、属性列表、协议列表,那成员变量呢?它在什么位置?在class_rw_t结构中有:// objc-runtime-new.h// 获取roconst class_ro_t *ro() const { auto v = get_ro_or_rwe(); if (slowpath(v.is<class_rw_ext_t *>())) { return v.get&l原创 2022-05-16 15:48:37 · 165 阅读 · 0 评论 -
类的底层探索(上)
类的底层探索(上)isa的走向首先从一张图开始说起,这样图是isa和superclass的走向图,那真的是这么走的吗?我们就通过代码,来看一下。isa的走向@interface LLPerson : NSObject@end@interface LLTeacher : LLPerson@end首先我们创建两个类,LLPerson继承自NSObject,LLTeacher继承自LLPerson。...原创 2022-05-15 01:35:24 · 293 阅读 · 0 评论 -
对象的底层探索(下)
对象的底层探索(下)影响对象内存的因素对象是怎么关联类型的?影响对象内存的因素从原来的分析我们得出,对象的本质是isa + 成员变量的值,那什么因素会影响对象的内存呢?我们先从一段代码开始:@interface LLPerson : NSObject// isa --- 8@property (nonatomic, strong) NSString *name; // 8@property (nonatomic, strong) NSString *hobby; // 8@property原创 2022-05-11 17:29:58 · 182 阅读 · 0 评论 -
对象的底层探索(上)
// objc-runtime-new.mm/************************************************************************ fixupMessageRef* Repairs an old vtable dispatch call site. 修复一个旧的vtable调度调用站点* vtable dispatch itself is not supported. Vtable调度本身不支持***************原创 2022-05-11 11:34:51 · 136 阅读 · 0 评论 -
Swift 类似HandyJSON解析Struct
Swift 类似HandyJSON解析StructHandyJSON从源码解析Struct获取TargetStructMetadata获取TargetStructDescriptor实现TargetRelativeDirectPointerFieldDescriptor和FieldRecordfieldOffsetVectorOffset计算偏移量代码的验证HandyJSONHandyJSON是阿里开发的一个在swift上把JSON数据转化为对应model的框架。与其他流行的Swift JSON库相比,原创 2022-01-13 00:22:42 · 2172 阅读 · 0 评论 -
Swift中的类和结构体(2)
Swift中的类和结构体(2)异变方法方法调度异变方法在Swift中,值类型属性不能被自身的实例方法修改,编译器不会通过编译,报错Left side of mutating operator isn't mutable: 'self' is immutable,自身是不能修改自身的。当加上mutating关键字后就可以通过编译struct LLPerson { var x = 0.0 var y = 0.0 //方法默认会有self参数,类似于OC中方法会有self和_cm原创 2021-12-30 00:22:34 · 1294 阅读 · 0 评论 -
Swift中的类和结构体(1)
Swift中的类和结构体类和结构体的比较类的初始化器类的生命周期类和结构体的比较swift中的类:class LLPerson { var age: Int var name: String init(_ age: Int, _ name: String) { self.age = age self.name = name }}var person = LLPerson(18, "LL")var person1 = pe原创 2021-12-26 21:00:08 · 1274 阅读 · 0 评论 -
OC类原理
OC类原理指针拷贝普通指针 - 值拷贝对象 - 指针拷贝数组指针for (int i = 0; i < 4; i++) { int value = *(d + i); NSLog(@"%d", value);}类的结构编译后的代码源码定义 typedef struct objc_class *Class;继承自struct objc_class : objc_objectobjc_object结构(结构体写法):NSObject结构(OC写法):原创 2021-01-18 23:17:26 · 109 阅读 · 0 评论 -
OC对象原理
OC对象原理 LLPerson *p1 = [LLPerson alloc]; LLPerson *p2 = [p1 init]; LLPerson *p3 = [p1 init]; NSLog(@"%@ - %p", p1, &p1); NSLog(@"%@ - %p", p2, &p2); NSLog(@"%@ - %p", p3, &p3);alloc 已经创建了对象 initalloc 实现 - 原理 - 源码原创 2021-01-15 00:15:46 · 103 阅读 · 0 评论 -
strong和copy
strong和copy通常情况下,NSString和NSArray会使用copy关键字修饰.代码实例://定义Person类@interface Person : NSObject@property (nonatomic, strong) NSArray *array1;@property (nonatomic, copy) NSArray *array2;@end//在View...原创 2018-10-12 14:28:51 · 363 阅读 · 0 评论 -
copy和mutableCopy
copy和mutableCopy浅复制:不考虑对象本身,仅仅拷贝指向对象的指针深复制:是直接拷贝整个对象内存到另一块内存中一般情况下,=基本上都是浅复制:UIView *view1 = [[UIView alloc] init];UIView *view2 = [[UIView alloc] init];view1 = view2;view1和view2的内存地址是一样的.cop...原创 2018-10-12 15:51:38 · 176 阅读 · 0 评论 -
关于KVC
KVC KeyValueCoding介绍最重要的四个方法KVC设值KVC取值KVC中的keyPathKVC处理异常KVC和容器类KVC和字典KVC的正确性验证KVC的使用介绍通过key名直接访问对象的属性,或者给对象的属性赋值.在运行时动态地访问和修改对象的属性,而不是在编译时确定.NSObject的扩展来实现的(NSKeyValueCoding)最重要的四个方法- (nullable ...原创 2018-10-31 23:55:49 · 117 阅读 · 0 评论 -
关于KVO
KVO KeyValueObserving 事件通知机制介绍流程兼容的调用方式实际应用注意点手动调用KVO实现原理缺点介绍允许对象监听另一个对象特定属性的改变KVO 一对一NSNotificationCenter 一对多KVO可以监听单个属性的变化,也可以监听集合对象的变化KVC的mutableArrayValueForKey: 获得代理对象, 代理对象的内部对象发生改变时,会调用KV...原创 2018-11-01 20:20:04 · 97 阅读 · 0 评论 -
Runtime
Runtime概述Runtime消息传递一些概念Runtime消息转发Runtime应用概述Runtime的特征主要是消息(方法)传递,如果消息在对象中找不到,就进行转发它是OC面向对象和动态机制的基石OC是一个动态语言,这意味着它不仅需要一个编译器,也需要一个运行时系统来动态得创建类和对象,进行消息传递和转发Runtime消息传递一个对象的方法像这样[obj method],编译器会...原创 2018-11-07 19:49:59 · 178 阅读 · 0 评论 -
SDWebImage(4.0)
SDWebImage 4.0流程(以UIImageView+WebCache为例)UIImage+WebCacheUIView+WebCacheUIView+WebCacheOperationSDWebImageManagerSDImageCacheSDWebImageDownloader一些问题流程(以UIImageView+WebCache为例)UIImage+WebCache这个分类只...原创 2018-11-14 16:50:24 · 356 阅读 · 0 评论 -
atomic和nonatomic
atomic和nonatomic主要区别atomicnonatomic伪代码演示实现总结主要区别系统生成的setter/getter方法不一样atomic生成的方法有加锁操作nonatomic生成的方法不加锁atomic加锁操作只保证了setter/getter的存取方法的线程安全线程1执行了某属性setter方法,执行到一半.线程2调用getter方法.那么会执行完setter方法...原创 2018-10-12 11:05:23 · 239 阅读 · 0 评论