├── Markdown ├── 001-OC对象的本质01-OC和C_C++.md ├── 002-OC对象的本质02-将OC转换为C_C++.md ├── 003-OC对象的本质03-NSObject的内存本质.md ├── 004-OC对象的本质04-class_getInstanceSize、malloc_size.md ├── 005-OC对象的本质05-回答面试题.md ├── 006-OC对象的本质06-窥探NSObject的内存.md ├── 007-OC对象的本质07-Student的本质.md ├── 008-OC对象的本质08-Student的内存布局.md ├── 009-OC对象的本质09-更复杂的继承结构.md ├── 010-OC对象的本质10-属性和方法.md ├── 012-OC对象的本质12-内存分配注意点.md ├── 014-OC对象的本质14-libmalloc源码.md ├── 017-OC对象的分类01-instance对象.md ├── 018-OC对象的分类02-class对象.md ├── 019-OC对象的分类03-meta-class对象.md ├── 020-OC对象的分类04-object_getClass内部实现.md ├── 025-isa与superclass经典图.md ├── 026-isa和superclass05-总结02.md ├── 035-KVO06-内部调用流程.md ├── 044-Cateogry02-底层结构.md ├── 055-Cateogry13-load、initialize总结.md ├── 060-关联对象05-key的用法.md ├── 063-关联对象08-底层数据结构02.md └── media │ ├── 15351917793139 │ └── 15351928901287.jpg │ ├── 15351948465367 │ └── 15351954847205.jpg │ ├── 15352512748480 │ └── double.png │ ├── 15354616297041 │ ├── 15354620582732.jpg │ └── 15354620962927.jpg │ └── 15362037370215 │ └── QQ20180906-112543.png └── README.md /Markdown/001-OC对象的本质01-OC和C_C++.md: -------------------------------------------------------------------------------- 1 | # 001-OC对象的本质01-OC和C_C++ 2 | 3 | * 平时编写的Objective-C代码,底层实现其实都是C\C++代码 4 | * 所以Objective-C的面向对象都是基于C\C++的`结构体`数据结构实现的 5 | 6 | -------------------------------------------------------------------------------- /Markdown/002-OC对象的本质02-将OC转换为C_C++.md: -------------------------------------------------------------------------------- 1 | # 002-OC对象的本质02-将OC转换为C_C++ 2 | 3 | > 命令行 4 | 5 | `xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc main.m -o main.cpp` 6 | 7 | -------------------------------------------------------------------------------- /Markdown/003-OC对象的本质03-NSObject的内存本质.md: -------------------------------------------------------------------------------- 1 | # 003-OC对象的本质03-NSObject的内存本质 2 | 3 | 一个OC对象在内存中是如何布局的 4 | 5 | ``` 6 | @interface NSObject { 7 | Class isa ; 8 | } 9 | @end 10 | struct NSObject_IMPL { 11 | Class isa; 12 | }; 13 | 14 | ``` 15 | 16 | -------------------------------------------------------------------------------- /Markdown/004-OC对象的本质04-class_getInstanceSize、malloc_size.md: -------------------------------------------------------------------------------- 1 | # 004-OC对象的本质04-class_getInstanceSize、malloc_size 2 | 3 | ![](http://oriq21dog.bkt.clouddn.com/20180825185717.png) 4 | 5 | ![](http://oriq21dog.bkt.clouddn.com/20180825185944.png) 6 | 7 | -------------------------------------------------------------------------------- /Markdown/005-OC对象的本质05-回答面试题.md: -------------------------------------------------------------------------------- 1 | # 005-OC对象的本质05-回答面试题 2 | 3 | 4 | 5 | 6 | > 一个NSObject对象占用多少内存? 7 | 8 | * 系统分配了16个字节给NSObject对象(通过malloc_size函数获得) 9 | * 但NSObject对象内部只使用了8个字节的空间(64bit环境下,可以通过class_getInstanceSize函数获得) 10 | 11 | 12 | -------------------------------------------------------------------------------- /Markdown/006-OC对象的本质06-窥探NSObject的内存.md: -------------------------------------------------------------------------------- 1 | # 006-OC对象的本质06-窥探NSObject的内存 2 | 3 | ![](http://oriq21dog.bkt.clouddn.com/20180825195249.png) 4 | 5 | ![](http://oriq21dog.bkt.clouddn.com/20180825195441.png) 6 | 7 | -------------------------------------------------------------------------------- /Markdown/007-OC对象的本质07-Student的本质.md: -------------------------------------------------------------------------------- 1 | # 007-OC对象的本质07-Student的本质 2 | 3 | ``` 4 | struct Student_IMPL { 5 | Class isa; 6 | int _no; 7 | int _age; 8 | }; 9 | ``` 10 | 11 | -------------------------------------------------------------------------------- /Markdown/008-OC对象的本质08-Student的内存布局.md: -------------------------------------------------------------------------------- 1 | # 008-OC对象的本质08-Student的内存布局 2 | 3 | -------------------------------------------------------------------------------- /Markdown/009-OC对象的本质09-更复杂的继承结构.md: -------------------------------------------------------------------------------- 1 | # 009-OC对象的本质09-更复杂的继承结构 2 | 3 | > 内存对齐:结构体的大小必须是最大成员大小的倍数 4 | 5 | ![](http://oriq21dog.bkt.clouddn.com/20180826104131.png) 6 | 7 | ![](http://oriq21dog.bkt.clouddn.com/20180826104138.png) 8 | 9 | 10 | -------------------------------------------------------------------------------- /Markdown/010-OC对象的本质10-属性和方法.md: -------------------------------------------------------------------------------- 1 | # 010-OC对象的本质10-属性和方法 2 | 3 | 4 | -------------------------------------------------------------------------------- /Markdown/012-OC对象的本质12-内存分配注意点.md: -------------------------------------------------------------------------------- 1 | # 012-OC对象的本质12-内存分配注意点 2 | ![](http://oriq21dog.bkt.clouddn.com/20180826212621.png) 3 | 4 | []() 5 | 6 | -------------------------------------------------------------------------------- /Markdown/014-OC对象的本质14-libmalloc源码.md: -------------------------------------------------------------------------------- 1 | # 014-OC对象的本质14-libmalloc源码 2 | 3 | * 结构体内存大小对齐 4 | * calloc内存对齐 5 | 6 | ##### 创建一个实例对象,至少需要多少内存? 7 | 8 | ``` 9 | #import 10 | class_getInstanceSize([NSObject class]) 11 | ``` 12 | ##### 创建一个实例对象,实际分配了多少内存? 13 | ``` 14 | #import 15 | malloc_size((__bridge const void *)obj); 16 | ``` 17 | 18 | 19 | 20 | ![](http://oriq21dog.bkt.clouddn.com/20180826214903.png) 21 | 22 | -------------------------------------------------------------------------------- /Markdown/017-OC对象的分类01-instance对象.md: -------------------------------------------------------------------------------- 1 | # 017-OC对象的分类01-instance对象 2 | 3 | * instance对象 (实例对象) 4 | * class对象 (类对象) 5 | * meta-class对象 (元类对象) 6 | 7 | -------------------------------------------------------------------------------- /Markdown/018-OC对象的分类02-class对象.md: -------------------------------------------------------------------------------- 1 | # 018-OC对象的分类02-class对象 2 | > 每个类在内存中有且只有一个class对象 3 | 4 | ![](media/15354616297041/15354620962927.jpg) 5 | 6 | 7 | ![](http://oriq21dog.bkt.clouddn.com/20180828211252.png) 8 | 9 | 10 | -------------------------------------------------------------------------------- /Markdown/019-OC对象的分类03-meta-class对象.md: -------------------------------------------------------------------------------- 1 | # 019-OC对象的分类03-meta-class对象 2 | 3 | **class方法返回的一直都是类对象** 4 | 5 | ![](http://oriq21dog.bkt.clouddn.com/20180828211838.png) 6 | 7 | ![](http://oriq21dog.bkt.clouddn.com/20180828212343.png) 8 | 9 | -------------------------------------------------------------------------------- /Markdown/020-OC对象的分类04-object_getClass内部实现.md: -------------------------------------------------------------------------------- 1 | # 020-OC对象的分类04-object_getClass内部实现 2 | 3 | 4 | ##### 1.Class objc_getClass(const char *aClassName) 5 | > 1 传入字符串类名 6 | > 2 返回对应的类对象 7 | 8 | ##### 2.Class object_getClass(id obj) 9 | > 传入的obj可能是instance对象、class对象、meta-class对象 10 | > 返回值 11 | > 如果是instance对象,则返回class对象 12 | > 如果是class对象,则返回meta-class对象 13 | > 如果是meta-class对象,则返回NSObject的meta-class对象 14 | 15 | ##### 3.- (Class)class、+(Class)class 16 | > 返回的是类对象 17 | 18 | ![](http://oriq21dog.bkt.clouddn.com/20180829195815.png) 19 | 20 | -------------------------------------------------------------------------------- /Markdown/025-isa与superclass经典图.md: -------------------------------------------------------------------------------- 1 | # 025 isa与superclass经典图 2 | 3 | ![](http://oriq21dog.bkt.clouddn.com/20180830204436.png) 4 | 5 | ![](http://oriq21dog.bkt.clouddn.com/20180830204614.png) 6 | 7 | ![](http://oriq21dog.bkt.clouddn.com/20180830204750.png) 8 | 9 | -------------------------------------------------------------------------------- /Markdown/026-isa和superclass05-总结02.md: -------------------------------------------------------------------------------- 1 | # 026-isa和superclass05-总结02 2 | ![](http://oriq21dog.bkt.clouddn.com/20180830202438.png) 3 | 4 | ![](http://oriq21dog.bkt.clouddn.com/20180830202554.png) 5 | 6 | ![](http://oriq21dog.bkt.clouddn.com/20180830202857.png) 7 | 8 | -------------------------------------------------------------------------------- /Markdown/035-KVO06-内部调用流程.md: -------------------------------------------------------------------------------- 1 | # 035-KVO06-内部调用流程 2 | > kvo-isa发生变化 3 | 4 | ![](http://oriq21dog.bkt.clouddn.com/20180904151635.png) 5 | 6 | > 无法产生派生类 7 | 8 | ![](http://oriq21dog.bkt.clouddn.com/20180904151641.png) 9 | 10 | > 添加kvo方法改变了 11 | 12 | ![](http://oriq21dog.bkt.clouddn.com/20180904151648.png) 13 | 14 | > object_getClass 与 class 返回的类对象不同 15 | 16 | ![](http://oriq21dog.bkt.clouddn.com/20180904152937.png) 17 | 18 | -------------------------------------------------------------------------------- /Markdown/044-Cateogry02-底层结构.md: -------------------------------------------------------------------------------- 1 | # 044-Cateogry02-底层结构 2 | ![](http://oriq21dog.bkt.clouddn.com/20180905100053.png) 3 | 4 | -------------------------------------------------------------------------------- /Markdown/055-Cateogry13-load、initialize总结.md: -------------------------------------------------------------------------------- 1 | # 055-Cateogry13-load、initialize总结 2 | 3 | ##### load、initialize方法的区别是什么? 4 | 5 | 1.调用方式 6 | > 1.load是根据函数地址直接调用 7 | > ![](http://oriq21dog.bkt.clouddn.com/20180906112452.png) 8 | > 2.initialize是通过objc_msgSend调用 9 | ![](http://oriq21dog.bkt.clouddn.com/20180906112603.png) 10 | 11 | 2.调用时刻 12 | > 1.load是runtime加载类、分类的时候调用(只会调用1次) 13 | > 2.initialize是类第一次接收到消息的时候调用,每一个类只会initialize一次(父类的initialize方法可能会被调用多次) 14 | 15 | 16 | ##### load、initialize的调用顺序 17 | 1.load 18 | > 先调用类的load 19 | > > 先编译的类,优先调用load 20 | > > 调用子类的load之前,会先调用父类的load 21 | 22 | > 再调用分类的load 23 | > > 先编译的分类,优先调用load 24 | 25 | 2.initialize 26 | > 先初始化父类 27 | > 再初始化子类(可能最终调用的是父类的initialize方法) 28 | 29 | 30 | -------------------------------------------------------------------------------- /Markdown/060-关联对象05-key的用法.md: -------------------------------------------------------------------------------- 1 | # 060-关联对象05-key的用法 2 | 3 | ``` 4 | 5 | static void *MyKey = &MyKey; 6 | objc_setAssociatedObject(obj, MyKey, value, OBJC_ASSOCIATION_RETAIN_NONATOMIC) 7 | objc_getAssociatedObject(obj, MyKey) 8 | 9 | static char MyKey; 10 | objc_setAssociatedObject(obj, &MyKey, value, OBJC_ASSOCIATION_RETAIN_NONATOMIC) 11 | objc_getAssociatedObject(obj, &MyKey) 12 | 13 | 使用属性名作为key 14 | objc_setAssociatedObject(obj, @"property", value, OBJC_ASSOCIATION_RETAIN_NONATOMIC); 15 | objc_getAssociatedObject(obj, @"property"); 16 | 17 | 使用get方法的@selecor作为key 18 | objc_setAssociatedObject(obj, @selector(getter), value, OBJC_ASSOCIATION_RETAIN_NONATOMIC) 19 | objc_getAssociatedObject(obj, @selector(getter)) 20 | 21 | ``` 22 | 23 | -------------------------------------------------------------------------------- /Markdown/063-关联对象08-底层数据结构02.md: -------------------------------------------------------------------------------- 1 | # 063-关联对象08-底层数据结构02 2 | 3 | 4 | ![](http://oriq21dog.bkt.clouddn.com/20180907093229.png) 5 | 6 | ## 底层结构 7 | ![](http://oriq21dog.bkt.clouddn.com/20180907093234.png) 8 | 9 | -------------------------------------------------------------------------------- /Markdown/media/15351917793139/15351928901287.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MisterBooo/iOSDeepLearning/f4e62bad3cdeeefd872e60723bf31140f44f7748/Markdown/media/15351917793139/15351928901287.jpg -------------------------------------------------------------------------------- /Markdown/media/15351948465367/15351954847205.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MisterBooo/iOSDeepLearning/f4e62bad3cdeeefd872e60723bf31140f44f7748/Markdown/media/15351948465367/15351954847205.jpg -------------------------------------------------------------------------------- /Markdown/media/15352512748480/double.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MisterBooo/iOSDeepLearning/f4e62bad3cdeeefd872e60723bf31140f44f7748/Markdown/media/15352512748480/double.png -------------------------------------------------------------------------------- /Markdown/media/15354616297041/15354620582732.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MisterBooo/iOSDeepLearning/f4e62bad3cdeeefd872e60723bf31140f44f7748/Markdown/media/15354616297041/15354620582732.jpg -------------------------------------------------------------------------------- /Markdown/media/15354616297041/15354620962927.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MisterBooo/iOSDeepLearning/f4e62bad3cdeeefd872e60723bf31140f44f7748/Markdown/media/15354616297041/15354620962927.jpg -------------------------------------------------------------------------------- /Markdown/media/15362037370215/QQ20180906-112543.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MisterBooo/iOSDeepLearning/f4e62bad3cdeeefd872e60723bf31140f44f7748/Markdown/media/15362037370215/QQ20180906-112543.png -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # iOSDeepLearning 2 | ![](http://oriq21dog.bkt.clouddn.com/20180827090107.jpg) 3 | ## 建这个仓库的目的 4 | 5 | 世人皆说阅读开源框架的源代码对于功力有显著的提升,然则笔者阅读开源框架之时,每每遇到一些底层知识的时候便一头雾水,无法再阅读下去,故打算先全面复习一下iOS的底层原理知识以做储备,在这里将自己学习iOS底层知识的心得记录下来,希望能对后续的阅读开源框架有所帮助。我会不断更新这个仓库中的文章,如果想要关注可以点 star。 6 | 7 | ## OC对象的本质 8 | 9 | * [001-OC对象的本质01-OC和C_C++](https://github.com/MisterBooo/iOSDeepLearning/blob/master/Markdown/001-OC%E5%AF%B9%E8%B1%A1%E7%9A%84%E6%9C%AC%E8%B4%A801-OC%E5%92%8CC_C%2B%2B.md) 10 | * [002-OC对象的本质02-将OC转换为C_C++](https://github.com/MisterBooo/iOSDeepLearning/blob/master/Markdown/002-OC%E5%AF%B9%E8%B1%A1%E7%9A%84%E6%9C%AC%E8%B4%A802-%E5%B0%86OC%E8%BD%AC%E6%8D%A2%E4%B8%BAC_C%2B%2B.md) 11 | * [003-OC对象的本质03-NSObject的内存本质](https://github.com/MisterBooo/iOSDeepLearning/blob/master/Markdown/003-OC%E5%AF%B9%E8%B1%A1%E7%9A%84%E6%9C%AC%E8%B4%A803-NSObject%E7%9A%84%E5%86%85%E5%AD%98%E6%9C%AC%E8%B4%A8.md) 12 | * [004-OC对象的本质04-class_getInstanceSize、malloc_size](https://github.com/MisterBooo/iOSDeepLearning/blob/master/Markdown/004-OC%E5%AF%B9%E8%B1%A1%E7%9A%84%E6%9C%AC%E8%B4%A804-class_getInstanceSize%E3%80%81malloc_size.md) 13 | * [005-OC对象的本质05-回答面试题](https://github.com/MisterBooo/iOSDeepLearning/blob/master/Markdown/005-OC%E5%AF%B9%E8%B1%A1%E7%9A%84%E6%9C%AC%E8%B4%A805-%E5%9B%9E%E7%AD%94%E9%9D%A2%E8%AF%95%E9%A2%98.md) 14 | * [006-OC对象的本质06-窥探NSObject的内存](https://github.com/MisterBooo/iOSDeepLearning/blob/master/Markdown/006-OC%E5%AF%B9%E8%B1%A1%E7%9A%84%E6%9C%AC%E8%B4%A806-%E7%AA%A5%E6%8E%A2NSObject%E7%9A%84%E5%86%85%E5%AD%98.md) 15 | * [007-OC对象的本质07-Student的本质](https://github.com/MisterBooo/iOSDeepLearning/blob/master/Markdown/007-OC%E5%AF%B9%E8%B1%A1%E7%9A%84%E6%9C%AC%E8%B4%A807-Student%E7%9A%84%E6%9C%AC%E8%B4%A8.md) 16 | * [008-OC对象的本质08-Student的内存布局](https://github.com/MisterBooo/iOSDeepLearning/blob/master/Markdown/008-OC对象的本质08-Student的内存布局.md) 17 | * [009-OC对象的本质09-更复杂的继承结构](https://github.com/MisterBooo/iOSDeepLearning/blob/master/Markdown/009-OC对象的本质09-更复杂的继承结构.md) 18 | * [010-OC对象的本质10-属性和方法](https://github.com/MisterBooo/iOSDeepLearning/blob/master/Markdown/010-OC对象的本质10-属性和方法.md) 19 | * [012-OC对象的本质12-内存分配注意点](https://github.com/MisterBooo/iOSDeepLearning/blob/master/Markdown/012-OC对象的本质12-内存分配注意点.md) 20 | * [014-OC对象的本质14-libmalloc源码](https://github.com/MisterBooo/iOSDeepLearning/blob/master/Markdown/014-OC对象的本质14-libmalloc源码.md) 21 | 22 | ## OC对象的分类 23 | 24 | * [017-OC对象的分类01-instance对象](https://github.com/MisterBooo/iOSDeepLearning/blob/master/Markdown/017-OC对象的分类01-instance对象.md) 25 | * [018-OC对象的分类02-class对象](https://github.com/MisterBooo/iOSDeepLearning/blob/master/Markdown/018-OC对象的分类02-class对象.md) 26 | * [019-OC对象的分类03-meta-class对象](https://github.com/MisterBooo/iOSDeepLearning/blob/master/Markdown/019-OC对象的分类03-meta-class对象.md) 27 | * [020-OC对象的分类04-object_getClass内部实现](https://github.com/MisterBooo/iOSDeepLearning/blob/master/Markdown/020-OC对象的分类04-object_getClass内部实现.md) 28 | * [025-isa与superclass经典图](https://github.com/MisterBooo/iOSDeepLearning/blob/master/Markdown/025-isa与superclass经典图.md) 29 | * [026-isa和superclass05-总结02](https://github.com/MisterBooo/iOSDeepLearning/blob/master/Markdown/026-isa和superclass05-总结02.md) 30 | 31 | ## KVO 32 | * [035-KVO06-内部调用流程](https://github.com/MisterBooo/iOSDeepLearning/blob/master/Markdown/035-KVO06-内部调用流程.md) 33 | 34 | ## Category 35 | * [044-Cateogry02-底层结构](https://github.com/MisterBooo/iOSDeepLearning/blob/master/Markdown/044-Cateogry02-底层结构.md) 36 | * [055-Cateogry13-load、initialize总结](https://github.com/MisterBooo/iOSDeepLearning/blob/master/Markdown/055-Cateogry13-load、initialize总结.md) 37 | 38 | ## 关联对象 39 | * [060-关联对象05-key的用法](https://github.com/MisterBooo/iOSDeepLearning/blob/master/Markdown/060-关联对象05-key的用法.md) 40 | * [063-关联对象08-底层数据结构02](https://github.com/MisterBooo/iOSDeepLearning/blob/master/Markdown/063-关联对象08-底层数据结构02.md) --------------------------------------------------------------------------------