├── .gitignore ├── ARKit ├── 1.第一题.md ├── 10.第十题.md ├── 11.第十一题.md ├── 12.第十二题.md ├── 13.第十三题.md ├── 14.第十四题.md ├── 15.第十五题.md ├── 16.第十六题.md ├── 17.第十七题.md ├── 18.第十八题.md ├── 19.第十九题.md ├── 2.第二题.md ├── 20.第二十题.md ├── 21.第二十一题.md ├── 22.第二十二题.md ├── 23.第二十三题.md ├── 3.第三题.md ├── 4.第四题.md ├── 5.第五题.md ├── 6.第六题.md ├── 7.第七题.md ├── 8.第八题.md └── 9.第九题.md ├── Animation ├── 1.第一题.md ├── 10.第十题.md ├── 11.第十一题.md ├── 12.第十二题.md ├── 13.第十三题.md ├── 14.第十四题.md ├── 15.第十五题.md ├── 16.第十六题.md ├── 17.第十七题.md ├── 18.第十八题.md ├── 19.第十九题.md ├── 2.第二题.md ├── 20.第二十题.md ├── 21.第二十一题.md ├── 22.第二十二题.md ├── 23.第二十三题.md ├── 3.第三题.md ├── 4.第四题.md ├── 5.第五题.md ├── 6.第六题.md ├── 7.第七题.md ├── 8.第八题.md └── 9.第九题.md ├── Core ML ├── 1.第一题.md ├── 10.第十题.md ├── 11.第十一题.md ├── 12.第十二题.md ├── 13.第十三题.md ├── 14.第十四题.md ├── 15.第十五题.md ├── 16.第十六题.md ├── 17.第十七题.md ├── 18.第十八题.md ├── 19.第十九题.md ├── 2.第二题.md ├── 20.第二十题.md ├── 21.第二十一题.md ├── 22.第二十二题.md ├── 23.第二十三题.md ├── 3.第三题.md ├── 4.第四题.md ├── 5.第五题.md ├── 6.第六题.md ├── 7.第七题.md ├── 8.第八题.md └── 9.第九题.md ├── Foundation ├── 1.第一题.md ├── 10.第十题.md ├── 11.第十一题.md ├── 12.第十二题.md ├── 13.第十三题md.md ├── 14.第十四题.md ├── 15.第十五题.md ├── 16.第十六题.md ├── 2.第二题.md ├── 3.第三题.md ├── 4.第四题.md ├── 5.第五题.md ├── 6.第六题.md ├── 7.第七题.md ├── 8.第八题.md └── 9.第九题.md ├── LICENSE ├── README.md ├── Runloop ├── 1.第一题.md ├── 10.第十题.md ├── 11.第十一题.md ├── 12.第十二题.md ├── 13.第十三题.md ├── 14.第十四题.md ├── 15.第十五题.md ├── 16.第十六题.md ├── 17.第十七题.md ├── 18.第十八题.md ├── 19.第十九题.md ├── 2.第二题.md ├── 20.第二十题.md ├── 21.第二十一题.md ├── 22.第二十二题.md ├── 23.第二十三题.md ├── 3.第三题.md ├── 4.第四题.md ├── 5.第五题.md ├── 6.第六题.md ├── 7.第七题.md ├── 8.第八题.md └── 9.第九题.md ├── Runtime ├── .DS_Store ├── 1.第一题.md ├── 10.第十题.md ├── 11.第十一题.md ├── 12.第十二题.md ├── 13.第十三题.md ├── 14.第十四题.md ├── 15.第十五题.md ├── 16.第十六题.md ├── 17.第十七题.md ├── 18.第十八题.md ├── 19.第十九题.md ├── 2.第二题.md ├── 20.第二十题.md ├── 21.第二十一题.md ├── 22.第二十二题.md ├── 23.第二十三题.md ├── 24.第二十四题.md ├── 25.第二十五题.md ├── 25.第二十五题的副本 3.md ├── 25.第二十五题的副本 4.md ├── 25.第二十五题的副本.md ├── 26.第二十六题.md ├── 3.第三题.md ├── 4.第四题.md ├── 5.第五题.md ├── 6.第六题.md ├── 7.第七题.md ├── 8.第八题.md └── 9.第九题.md ├── Runtime消息转发.md ├── UIKit ├── 1.第一题.md ├── 10.第十题.md ├── 11.第十一题.md ├── 12.第十二题.md ├── 2.第二题.md ├── 3.第三题.md ├── 4.第四题.md ├── 5.第五题.md ├── 6.第六题.md ├── 7.第七题.md ├── 8.第八题.md └── 9.第九题.md ├── WebView ├── .DS_Store ├── 1.第一题.md └── 2.第二题.md ├── 代码管理 ├── 1.1-1.md ├── 1.1-2.md ├── 1.1-3.md ├── 1.1-4.md ├── 1.1-5.md ├── 13.第十三题.md ├── 14.第十四题.md ├── 15.第十五题.md ├── 16.第十六题.md ├── 17.第十七题.md ├── 18.第十八题.md ├── 19.第十九题.md ├── 20.第二十题.md ├── 21.第二十一题.md ├── 22.第二十二题.md ├── 23.第二十三题.md ├── 3.3-1.md ├── 3.3-2.md ├── 3.3-3.md ├── 3.3-4.md ├── 3.3-5.md ├── 3.3-6.md ├── 3.3-7.md └── 3.3-8.md ├── 其他问题 ├── .DS_Store ├── 1.第一题.md ├── 12.第十二题.md ├── 13.第十三题.md ├── 14.第十四题.md ├── 15.第十五题.md ├── 16.第十六题.md ├── 17.第十七题.md ├── 18.第十八题.md ├── 19.第十九题.md ├── 2.第二题.md ├── 20.第二十题.md ├── 21.第二十一题.md ├── 22.第二十二题.md ├── 23.第二十三题.md ├── 24.第二十四题.md ├── 25.第二十五题.md ├── 3.第三题.md ├── 4.第四题.md └── 6.第六题.md ├── 内存管理 ├── .DS_Store ├── 1.第一题.md ├── 10.第十题.md ├── 11.第十一题.md ├── 12.第十二题.md ├── 13.第十三题.md ├── 14.第十四题.md ├── 15.第十五题.md ├── 16.第十六题.md ├── 17.第十七题.md ├── 18.第十八题.md ├── 19.第十九题.md ├── 2.第二题.md ├── 20.第二十题.md ├── 21.第二十一题.md ├── 22.第二十二题.md ├── 23.第二十三题.md ├── 24.第二十四题.md ├── 3.第三题.md ├── 4.第四题.md ├── 5.第五题.md ├── 6.第六题.md ├── 7.第七题.md ├── 8.第八题.md └── 9.第九题.md ├── 图像处理 ├── .DS_Store ├── 1.第一题.md ├── 10.第十题.md ├── 11.第十一题.md ├── 12.第十二题.md ├── 13.第十三题.md ├── 14.第十四题.md ├── 15.第十五题.md ├── 16.第十六题.md ├── 17.第十七题.md ├── 18.第十八题.md ├── 19.第十九题.md ├── 2.第二题.md ├── 20.第二十题.md ├── 21.第二十一题.md ├── 22.第二十二题.md ├── 23.第二十三题.md ├── 3.第三题.md ├── 4.第四题.md ├── 5.第五题.md ├── 6.第六题.md ├── 7.第七题.md ├── 8.第八题.md └── 9.第九题.md ├── 多线程 ├── 1.第一题.md ├── 10.第十题.md ├── 11.第十一题.md ├── 12.第十二题.md ├── 13.第十三题.md ├── 14.第十四题.md ├── 15.第十五题.md ├── 16.第十六题.md ├── 17.第十七题.md ├── 18.第十八题.md ├── 19.第十九题.md ├── 2.第二题.md ├── 20.第二十题.md ├── 21.第二十一题.md ├── 22.第二十二题.md ├── 23.第二十三题.md ├── 3.第三题.md ├── 4.第四题.md ├── 5.第五题.md ├── 6.第六题.md ├── 7.第七题.md ├── 8.第八题.md └── 9.第九题.md ├── 开放性问题 ├── 1.第一题.md ├── 10.第十题.md ├── 11.第十一题.md ├── 12.第十二题.md ├── 13.第十三题.md ├── 14.第十四题.md ├── 15.第十五题.md ├── 16.第十六题.md ├── 17.第十七题.md ├── 18.第十八题.md ├── 19.第十九题.md ├── 2.第二题.md ├── 20.第二十题.md ├── 21.第二十一题.md ├── 22.第二十二题.md ├── 23.第二十三题.md ├── 3.第三题.md ├── 4.第四题.md ├── 5.第五题.md ├── 6.第六题.md ├── 7.第七题.md ├── 8.第八题.md └── 9.第九题.md ├── 性能优化 ├── 1.第一题.md ├── 10.第十题.md ├── 11.第十一题.md ├── 12.第十二题.md ├── 13.第十三题.md ├── 14.第十四题.md ├── 15.第十五题.md ├── 16.第十六题.md ├── 17.第十七题.md ├── 18.第十八题.md ├── 19.第十九题.md ├── 2.第二题.md ├── 20.第二十题.md ├── 21.第二十一题.md ├── 22.第二十二题.md ├── 23.第二十三题.md ├── 3.第三题.md ├── 4.第四题.md ├── 5.第五题.md ├── 6.第六题.md ├── 7.第七题.md ├── 8.第八题.md └── 9.第九题.md ├── 扩展问题 ├── 1.第一题.md ├── 10.第十题.md ├── 11.第十一题.md ├── 12.第十二题.md ├── 13.第十三题.md ├── 14.第十四题.md ├── 15.第十五题.md ├── 16.第十六题.md ├── 17.第十七题.md ├── 18.第十八题.md ├── 19.第十九题.md ├── 2.第二题.md ├── 20.第二十题.md ├── 21.第二十一题.md ├── 22.第二十二题.md ├── 23.第二十三题.md ├── 3.第三题.md ├── 4.第四题.md ├── 5.第五题.md ├── 6.第六题.md ├── 7.第七题.md ├── 8.第八题.md └── 9.第九题.md ├── 数据存储 ├── 1.1-1.md ├── 10.第十题.md ├── 11.第十一题.md ├── 12.第十二题.md ├── 13.第十三题.md ├── 14.第十四题.md ├── 15.第十五题.md ├── 16.第十六题.md ├── 17.第十七题.md ├── 18.第十八题.md ├── 19.第十九题.md ├── 2.2-1.md ├── 20.第二十题.md ├── 21.第二十一题.md ├── 22.第二十二题.md ├── 23.第二十三题.md ├── 3.第三题.md ├── 4.4-1.md ├── 5.5-1.md ├── 6.6-1.md ├── 7.第七题.md ├── 8.第八题.md └── 9.第九题.md ├── 数据安全及加密 ├── 1.第一题.md ├── 10.第十题.md ├── 11.第十一题.md ├── 12.第十二题.md ├── 13.第十三题.md ├── 14.第十四题.md ├── 15.第十五题.md ├── 16.第十六题.md ├── 17.第十七题.md ├── 18.第十八题.md ├── 19.第十九题.md ├── 2.第二题.md ├── 20.第二十题.md ├── 21.第二十一题.md ├── 22.第二十二题.md ├── 23.第二十三题.md ├── 3.第三题.md ├── 4.第四题.md ├── 5.第五题.md ├── 6.第六题.md ├── 7.第七题.md ├── 8.第八题.md └── 9.第九题.md ├── 数据结构 ├── 1.1-2.md ├── 1.1-3.md ├── 1.1-4.md ├── 5.第五题.md ├── 6.第六题.md ├── 字典.md ├── 数组.md └── 链表.md ├── 消息传递的方式 ├── 1.第一题.md ├── 10.第十题.md ├── 11.第十一题.md ├── 12.第十二题.md ├── 13.第十三题.md ├── 14.第十四题.md ├── 15.第十五题.md ├── 16.第十六题.md ├── 17.第十七题.md ├── 18.第十八题.md ├── 19.第十九题.md ├── 2.第二题.md ├── 20.第二十题.md ├── 21.第二十一题.md ├── 22.第二十二题.md ├── 23.第二十三题.md ├── 3.第三题.md ├── 4.第四题.md ├── 5.第五题.md ├── 6.第六题.md ├── 7.第七题.md ├── 8.第八题.md └── 9.第九题.md ├── 源代码阅读 ├── 1.第一题.md ├── 10.第十题.md ├── 11.第十一题.md ├── 12.第十二题.md ├── 13.第十三题.md ├── 14.第十四题.md ├── 15.第十五题.md ├── 16.第十六题.md ├── 17.第十七题.md ├── 18.第十八题.md ├── 19.第十九题.md ├── 2.第二题.md ├── 20.第二十题.md ├── 21.第二十一题.md ├── 22.第二十二题.md ├── 23.第二十三题.md ├── 3.第三题.md ├── 4.第四题.md ├── 5.第五题.md ├── 6.第六题.md ├── 7.第七题.md ├── 8.第八题.md └── 9.第九题.md ├── 算法集合 ├── .DS_Store ├── 1.第一题.md ├── 10.第十题.md ├── 13.第十三题.md ├── 2.第二题.md ├── 3.第三题.md ├── 4.第四题.md ├── 5.第五题.md ├── 6.第六题.md ├── 7.第七题.md ├── 8.第八题.md ├── 9.第九题.md ├── 二维数组查找.md ├── 冒泡排序.md ├── 快速排序.md ├── 排序算法.md └── 选择排序.md ├── 网络 ├── 1.第一题.md ├── 10.第十题.md ├── 11.第十一题.md ├── 12.第十二题.md ├── 13.第十三题.md ├── 14.第十四题.md ├── 15.第十五题.md ├── 16.第十六题.md ├── 17.第十七题.md ├── 18.第十八题.md ├── 19.第十九题.md ├── 2.第二题.md ├── 20.第二十题.md ├── 21.第二十一题.md ├── 22.第二十二题.md ├── 23.第二十三题.md ├── 24.第二十四题.md ├── 25.第二十五题.md ├── 26.第二十六题.md ├── 27.第二十七题.md ├── 28.第二十八题.md ├── 29.第二十九题.md ├── 3.第三题.md ├── 30.第三十题.md ├── 31.第三十一题.md ├── 4.第四题.md ├── 5.第五题.md ├── 6.第六题.md ├── 7.第七题.md ├── 8.第八题.md └── 9.第九题.md ├── 蓝牙 ├── 1.第一题.md ├── 10.第十题.md ├── 11.第十一题.md ├── 12.第十二题.md ├── 13.第十三题.md ├── 14.第十四题.md ├── 15.第十五题.md ├── 16.第十六题.md ├── 17.第十七题.md ├── 18.第十八题.md ├── 19.第十九题.md ├── 2.第二题.md ├── 20.第二十题.md ├── 21.第二十一题.md ├── 22.第二十二题.md ├── 23.第二十三题.md ├── 3.第三题.md ├── 4.第四题.md ├── 5.第五题.md ├── 6.第六题.md ├── 7.第七题.md ├── 8.第八题.md └── 9.第九题.md ├── 视频处理 ├── 1.第一题.md ├── 10.第十题.md ├── 11.第十一题.md ├── 12.第十二题.md ├── 13.第十三题.md ├── 14.第十四题.md ├── 15.第十五题.md ├── 16.第十六题.md ├── 17.第十七题.md ├── 18.第十八题.md ├── 19.第十九题.md ├── 2.第二题.md ├── 20.第二十题.md ├── 21.第二十一题.md ├── 22.第二十二题.md ├── 23.第二十三题.md ├── 3.第三题.md ├── 4.第四题.md ├── 5.第五题.md ├── 6.第六题.md ├── 7.第七题.md ├── 8.第八题.md └── 9.第九题.md ├── 计算题 ├── 1.第一题.md ├── 10.第十题.md ├── 11.第十一题.md ├── 12.第十二题.md ├── 13.第十三题.md ├── 14.第十四题.md ├── 15.第十五题.md ├── 16.第十六题.md ├── 17.第十七题.md ├── 18.第十八题.md ├── 19.第十九题.md ├── 2.第二题.md ├── 20.第二十题.md ├── 21.第二十一题.md ├── 22.第二十二题.md ├── 23.第二十三题.md ├── 3.第三题.md ├── 4.第四题.md ├── 5.第五题.md ├── 6.第六题.md ├── 7.第七题.md ├── 8.第八题.md └── 9.第九题.md ├── 设计模式 ├── .DS_Store ├── 1.第一题.md ├── 2.第二题.md ├── 3.第三题.md ├── 4.第四题.md └── DesignPatten │ ├── .DS_Store │ ├── Adapter │ ├── CoolTarget.h │ ├── CoolTarget.m │ ├── Target.h │ └── Target.m │ ├── Bridge │ ├── BaseObjectA.h │ ├── BaseObjectA.m │ ├── BaseObjectB.h │ ├── BaseObjectB.m │ ├── BridgeDemo.h │ ├── BridgeDemo.m │ ├── ObjectA1.h │ ├── ObjectA1.m │ ├── ObjectA2.h │ ├── ObjectA2.m │ ├── ObjectB1.h │ ├── ObjectB1.m │ ├── ObjectB2.h │ └── ObjectB2.m │ ├── Command │ ├── Command.h │ ├── Command.m │ ├── CommandManager.h │ └── CommandManager.m │ ├── DesignPatten.xcodeproj │ ├── project.pbxproj │ └── project.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist │ ├── DesignPatten │ ├── AppDelegate.h │ ├── AppDelegate.m │ ├── Assets.xcassets │ │ └── AppIcon.appiconset │ │ │ └── Contents.json │ ├── Base.lproj │ │ ├── LaunchScreen.storyboard │ │ └── Main.storyboard │ ├── Info.plist │ ├── ViewController.h │ ├── ViewController.m │ └── main.m │ ├── DesignPattenUITests │ ├── DesignPattenUITests.m │ └── Info.plist │ ├── Responder │ ├── BusinessObject.h │ └── BusinessObject.m │ └── SingleInstance │ ├── Mooc.h │ └── Mooc.m ├── 读书笔记 └── Effective_Objective-C.md ├── 调试技巧 ├── 1.第一题.md ├── 10.第十题.md ├── 11.第十一题.md ├── 12.第十二题.md ├── 13.第十三题.md ├── 14.第十四题.md ├── 15.第十五题.md ├── 16.第十六题.md ├── 17.第十七题.md ├── 18.第十八题.md ├── 19.第十九题.md ├── 2.第二题.md ├── 20.第二十题.md ├── 21.第二十一题.md ├── 22.第二十二题.md ├── 23.第二十三题.md ├── 3.第三题.md ├── 4.第四题.md ├── 5.第五题.md ├── 6.第六题.md ├── 7.第七题.md ├── 8.第八题.md └── 9.第九题.md ├── 逆向及安全 ├── 1.第一题.md ├── 10.第十题.md ├── 11.第十一题.md ├── 12.第十二题.md ├── 13.第十三题.md ├── 14.第十四题.md ├── 15.第十五题.md ├── 16.第十六题.md ├── 17.第十七题.md ├── 18.第十八题.md ├── 19.第十九题.md ├── 2.第二题.md ├── 20.第二十题.md ├── 21.第二十一题.md ├── 22.第二十二题.md ├── 23.第二十三题.md ├── 3.第三题.md ├── 4.第四题.md ├── 5.第五题.md ├── 6.第六题.md ├── 7.第七题.md ├── 8.第八题.md └── 9.第九题.md ├── 音频处理 ├── .DS_Store ├── 1.第一题.md ├── 10.第十题.md ├── 11.第十一题.md ├── 12.第十二题.md ├── 13.第十三题.md ├── 2.第二题.md ├── 3.第三题.md ├── 4.第四题.md ├── 5.第五题.md ├── 6.第六题.md ├── 7.第七题.md ├── 8.第八题.md └── 9.第九题.md └── 项目架构 ├── 1.第一题.md ├── 10.第十题.md ├── 11.第十一题.md ├── 12.第十二题.md ├── 13.第十三题.md ├── 14.第十四题.md ├── 15.第十五题.md ├── 16.第十六题.md ├── 17.第十七题.md ├── 18.第十八题.md ├── 19.第十九题.md ├── 2.第二题.md ├── 20.第二十题.md ├── 21.第二十一题.md ├── 22.第二十二题.md ├── 23.第二十三题.md ├── 3.第三题.md ├── 4.第四题.md ├── 5.第五题.md ├── 6.第六题.md ├── 7.第七题.md ├── 8.第八题.md └── 9.第九题.md /ARKit/1.第一题.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /ARKit/10.第十题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /ARKit/11.第十一题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /ARKit/12.第十二题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /ARKit/13.第十三题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /ARKit/14.第十四题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /ARKit/15.第十五题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /ARKit/16.第十六题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /ARKit/17.第十七题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /ARKit/18.第十八题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /ARKit/19.第十九题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /ARKit/2.第二题.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /ARKit/20.第二十题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /ARKit/21.第二十一题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /ARKit/22.第二十二题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /ARKit/23.第二十三题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /ARKit/3.第三题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /ARKit/4.第四题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /ARKit/5.第五题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /ARKit/6.第六题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /ARKit/7.第七题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | * 2.`分类` 不能给系统的类添加方法。 5 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 6 | 7 | -------------------------------------------------------------------------------- /ARKit/8.第八题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /ARKit/9.第九题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /Animation/1.第一题.md: -------------------------------------------------------------------------------- 1 | ## 1.简要说一下常用的动画库。 2 | 3 | 4 | 我之前在动画方面用的较少。 5 | 6 | 最常用的是 `FaceBook` 的 [Pop](https://github.com/facebook/pop)。 7 | 8 | 目前 `AirBnb` 的 [Lottie](https://github.com/airbnb/lottie-ios) 也很好,感兴趣可以去看看 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /Animation/10.第十题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /Animation/11.第十一题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /Animation/12.第十二题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /Animation/13.第十三题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /Animation/14.第十四题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /Animation/15.第十五题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /Animation/16.第十六题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /Animation/17.第十七题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /Animation/18.第十八题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /Animation/19.第十九题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /Animation/2.第二题.md: -------------------------------------------------------------------------------- 1 | ## 2.请说一下对 CALayer 的认识。 2 | 3 | 4 | `layer` 层是涂层绘制、渲染、以及动画的完成者,它无法直接的处理触摸事件(也可以捕捉事件) 5 | 6 | `layer` 包含的方面非常多,常见的属性有 `Frame`、`Bounds`、`Position`、`AnchorPoint`、`Contents` 等等。 7 | 8 | 想详细了解 `CALayer` 以及动画的 ,可以看看这本书 - [Core-Animation](https://legacy.gitbook.com/book/zsisme/ios-/details) 9 | 10 | 11 | -------------------------------------------------------------------------------- /Animation/20.第二十题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /Animation/21.第二十一题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /Animation/22.第二十二题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /Animation/23.第二十三题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /Animation/3.第三题.md: -------------------------------------------------------------------------------- 1 | ## 3.解释一下 `CALayer.contents` 属性。 2 | 3 | `CALayer` 的 `Contents` 有几下几个主要的属性: 4 | 5 | ###### ContentsRect 6 | 7 | 单位制(0 - 1),限制显示的范围区域 8 | 9 | ###### ContentGravity 10 | 11 | 类似于 ContentMode,不过不是枚举值,而是字符串 12 | 13 | ###### ContentsScale 14 | 15 | 决定了物理显示屏是 几@X屏 16 | 17 | ###### ContentsCenter 18 | 19 | 跟拉伸有关的属性 20 | 21 | -------------------------------------------------------------------------------- /Animation/4.第四题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /Animation/5.第五题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /Animation/6.第六题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /Animation/7.第七题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | * 2.`分类` 不能给系统的类添加方法。 5 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 6 | 7 | -------------------------------------------------------------------------------- /Animation/8.第八题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /Animation/9.第九题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /Core ML/1.第一题.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /Core ML/10.第十题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /Core ML/11.第十一题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /Core ML/12.第十二题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /Core ML/13.第十三题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /Core ML/14.第十四题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /Core ML/15.第十五题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /Core ML/16.第十六题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /Core ML/17.第十七题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /Core ML/18.第十八题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /Core ML/19.第十九题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /Core ML/2.第二题.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /Core ML/20.第二十题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /Core ML/21.第二十一题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /Core ML/22.第二十二题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /Core ML/23.第二十三题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /Core ML/3.第三题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /Core ML/4.第四题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /Core ML/5.第五题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /Core ML/6.第六题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /Core ML/7.第七题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | * 2.`分类` 不能给系统的类添加方法。 5 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 6 | 7 | -------------------------------------------------------------------------------- /Core ML/8.第八题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /Core ML/9.第九题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /Foundation/1.第一题.md: -------------------------------------------------------------------------------- 1 | ## 1.`nil`、`NIL`、`NSNULL` 有什么区别? 2 | 3 | 4 | - `nil`、`NIL` 可以说是等价的,都代表内存中一块空地址。 5 | 6 | - `NSNULL` 代表一个指向 `nil` 的对象。 7 | 8 | -------------------------------------------------------------------------------- /Foundation/10.第十题.md: -------------------------------------------------------------------------------- 1 | ## 10.`@synthesize` 和 `@dynamic` 分别有什么作用? 2 | 3 | `@synthesize` 是自动合成 `Setter`,`Getter` 方法。 4 | 5 | `@dynamic`是动态添加 `Setter`,`Getter` 方法。 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Foundation/11.第十一题.md: -------------------------------------------------------------------------------- 1 | ## 11.`Obj-C` 中的反射机制了解吗? 2 | 3 | 4 | 结合 `Runtime` 看这里。 5 | 6 | ```objc 7 | // SEL和字符串转换 8 | FOUNDATION_EXPORT NSString *NSStringFromSelector(SEL aSelector); 9 | FOUNDATION_EXPORT SEL NSSelectorFromString(NSString *aSelectorName); 10 | // Class和字符串转换 11 | FOUNDATION_EXPORT NSString *NSStringFromClass(Class aClass); 12 | FOUNDATION_EXPORT Class __nullable NSClassFromString(NSString *aClassName); 13 | // Protocol和字符串转换 14 | FOUNDATION_EXPORT NSString *NSStringFromProtocol(Protocol *proto) NS_AVAILABLE(10_5, 2_0); 15 | FOUNDATION_EXPORT Protocol * __nullable NSProtocolFromString(NSString *namestr) NS_AVAILABLE(10_5, 2_0); 16 | ``` 17 | 18 | 19 | -------------------------------------------------------------------------------- /Foundation/12.第十二题.md: -------------------------------------------------------------------------------- 1 | ## 12.`typeof` 和 `__typeof`,`__typeof__` 的区别? 2 | 3 | `__typeof __()` 和 `__typeof()` 是 `C语言` 的编译器特定扩展,因为标准 `C` 不包含这样的运算符。 标准 `C` 要求编译器用双下划线前缀语言扩展(这也是为什么你不应该为自己的函数,变量等做这些) 4 | 5 | `typeof()` 与前两者完全相同的,只不过去掉了下划线,同时现代的编译器也可以理解。 6 | 7 | 所有这三个意思是相同的,但没有一个是标准C,不同的编译器会按需选择符合标准的写法。 8 | 9 | 10 | -------------------------------------------------------------------------------- /Foundation/13.第十三题md.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /Foundation/14.第十四题.md: -------------------------------------------------------------------------------- 1 | ## 14.头文件导入的方式? 2 | 3 | 4 | 特别是针对以 CocoaPods 集成进来的库 5 | 6 | ```objc 7 | #if __has_include() 8 | #import 9 | #else 10 | #import "AFNetworking.h" 11 | #endif 12 | ``` 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /Foundation/15.第十五题.md: -------------------------------------------------------------------------------- 1 | ## 如何将 `Obj-C` 代码改变为 `C++/C` 的代码? 2 | 3 | ``` 4 | // 在当前路径下执行 5 | clang rewrite-objc main.m -o main.cpp 6 | ``` 7 | 上面的方法会生成不同平台下的源代码,大约有10万行,但我们只想要 iOS 平台下的相关代码,我们可取以下的方式: 8 | 9 | 10 | ``` 11 | // xcrun == Xcode Run 12 | // -sdk 指定系统平台 13 | // -arch 指定的架构 14 | xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc main.m -o main-arm64.cpp 15 | ``` 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /Foundation/16.第十六题.md: -------------------------------------------------------------------------------- 1 | ## 16.知不知道在哪里下载苹果的源代码? 2 | 3 | https://openSource.apple.com/tarballs 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /Foundation/2.第二题.md: -------------------------------------------------------------------------------- 1 | ## 2.如何实现一个线程安全的 `NSMutableArray`? 2 | 3 | 主要是多线程读写时,需要加锁。 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /Foundation/3.第三题.md: -------------------------------------------------------------------------------- 1 | ## 3.如何定义一台 `iOS` 设备的唯一性? 2 | * 1.`IMEI`:国际移动设备身份码,iOS 5 以后苹果不再允许获取 IMEI 3 | * 2.`UDID`: iOS 设备的唯一识别码,在 iOS 6(2013 年 5 月 ) 以后被 Apple 禁止 4 | * 3.`IDFA`:广告标识符,每台设备的唯一ID。用户可以禁止、重置、还原,iOS 6提出。 5 | * 4.`MAC地址`:网络唯一标识符,iOS 7 之后 6 | * 5.`UUID`:(Universally Unique IDentifier):通用唯一识别码,NSUUID 每次获取的值都会发生变化,但是它会保持唯一性 7 | * 6.`IDFV`:Vendor 标示符,也被称为厂商标识符。只要用户的设备中没有卸载当前 Vendor 的所有 APP,则不会发生变化。什么是 Vendor ?可以理解成 bundleID 的前两部分 8 | 9 | 结论:2017 年的我们想要通过 `UDID`、`Mac` 地址、`OpenUDID` 来定位用户设备已经是不可能啦,因为它们要么是无效,要么是受到了 `App Store` 的限制。但是如果你想要追踪广告的话,可以使用 `IDFA`,想要用来分析用户行为可以使用 `IDFV + KeyChain` 来解决。 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /Foundation/4.第四题.md: -------------------------------------------------------------------------------- 1 | ## 4.`atomic` 修饰的属性是绝对安全的吗?为什么? 2 | 3 | 4 | 5 | 不是,所谓的安全只是局限于 `Setter`、`Getter` 的访问器方法而言的,你对它做 `Release` 的操作是不会受影响的。这个时候就容易崩溃了。 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /Foundation/5.第五题.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /Foundation/6.第六题.md: -------------------------------------------------------------------------------- 1 | ## 6.`id` 和 `instanceType` 有什么区别? 2 | 3 | 4 | ##### 相同点 5 | `instancetype` 和 `id` 都是万能指针,指向对象。 6 | 7 | 8 | ##### 不同点: 9 | 10 | - 1.`id` 在编译的时候不能判断对象的真实类型,`instancetype` 在编译的时候可以判断对象的真实类型。 11 | - 2.`id` 可以用来定义变量,可以作为返回值类型,可以作为形参类型;`instancetype` 只能作为返回值类型。 12 | 13 | 14 | 15 | 16 | 17 | ###### 区别1: 18 | 19 | 在 ARC 环境下: 20 | 21 | instancetype用来在编译期确定实例的类型,而使用id的话,编译器不检查类型, 运行时检查类型. 22 | 23 | 在 MRC 环境下: 24 | 25 | instancetype 和 id 一样,不做具体类型检查 26 | 27 | ###### 区别2: 28 | 29 | id可以作为方法的参数,但instancetype不可以 30 | 31 | instancetype 只适用于初始化方法和便利构造器的返回值类型 32 | -------------------------------------------------------------------------------- /Foundation/7.第七题.md: -------------------------------------------------------------------------------- 1 | ## 7.简述事件传递、事件响应机制。 2 | 3 | [参考文章](https://www.jianshu.com/p/2e074db792ba) 4 | 5 | 概括的讲,事件传递是由内到外,事件响应是由外到内。 6 | 7 | 8 | -------------------------------------------------------------------------------- /Foundation/8.第八题.md: -------------------------------------------------------------------------------- 1 | ## 8.说一下对 `Super` 关键字的理解。 2 | 3 | 4 | 这是一个编译器的特性,优先到父类中寻找方法。 5 | 6 | -------------------------------------------------------------------------------- /Foundation/9.第九题.md: -------------------------------------------------------------------------------- 1 | 2 | ## 9.了解 `逆变` 和 `协变` 吗? 3 | 4 | 5 | iOS 9 之后的新特性,基于泛型,在有父子继承关系的时候会用到逆变与协变。 6 | 7 | 可以看一下[这篇文章](https://blog.csdn.net/imkata/article/details/78859482) 8 | 9 | -------------------------------------------------------------------------------- /Runloop/1.第一题.md: -------------------------------------------------------------------------------- 1 | ## 1.`Runloop` 和线程的关系? 2 | 3 | 1. 一个线程对应一个 `Runloop`。 4 | 5 | 2. 主线程的默认就有了 `Runloop`。 6 | 7 | 8 | 3. 子线程的 `Runloop` 以懒加载的形式创建。 9 | 10 | 11 | 4. `Runloop` 存储在一个全局的可变字典里,线程是 `key` ,`Runloop` 是 `value`。 12 | 13 | -------------------------------------------------------------------------------- /Runloop/10.第十题.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | ## 10.解释一下 `NSTimer`。 4 | 5 | `NSTimer` 其实就是 `CFRunLoopTimerRef`,他们之间是 `toll-free bridged` 的。一个 `NSTimer` 注册到 `RunLoop` 后,`RunLoop` 会为其重复的时间点注册好事件。例如 `10:00`, `10:10`, `10:20` 这几个时间点。`RunLoop` 为了节省资源,并不会在非常准确的时间点回调这个`Timer`。`Timer` 有个属性叫做 `Tolerance` (宽容度),标示了当时间点到后,容许有多少最大误差。 6 | 7 | 如果某个时间点被错过了,例如执行了一个很长的任务,则那个时间点的回调也会跳过去,不会延后执行。就比如等公交,如果 10:10 时我忙着玩手机错过了那个点的公交,那我只能等 10:20 这一趟了。 8 | 9 | `CADisplayLink` 是一个和屏幕刷新率一致的定时器(但实际实现原理更复杂,和 NSTimer 并不一样,其内部实际是操作了一个 `Source`)。如果在两次屏幕刷新之间执行了一个长任务,那其中就会有一帧被跳过去(和 `NSTimer` 相似),造成界面卡顿的感觉。在快速滑动 `TableView` 时,即使一帧的卡顿也会让用户有所察觉。`Facebook` 开源的 `AsyncDisplayLink` 就是为了解决界面卡顿的问题,其内部也用到了 `RunLoop`。 10 | 11 | 12 | ## `NSTimer` 循环引用示例 13 | 14 | ![](http://okhqmtd8q.bkt.clouddn.com/NSTimer%20Reference%20Cycle.png) 15 | 16 | -------------------------------------------------------------------------------- /Runloop/12.第十二题.md: -------------------------------------------------------------------------------- 1 | ## 12.`PerformSelector` 的实现原理? 2 | 3 | 4 | 当调用 NSObject 的 performSelecter:afterDelay: 后,实际上其内部会创建一个 Timer 并添加到当前线程的 RunLoop 中。所以如果当前线程没有 RunLoop,则这个方法会失效。 5 | 6 | 当调用 performSelector:onThread: 时,实际上其会创建一个 Timer 加到对应的线程去,同样的,如果对应线程没有 RunLoop 该方法也会失效。 7 | 8 | -------------------------------------------------------------------------------- /Runloop/13.第十三题.md: -------------------------------------------------------------------------------- 1 | ## 13.利用 `runloop` 解释一下页面的渲染的过程? 2 | 3 | 当我们调用 `[UIView setNeedsDisplay]` 时,这时会调用当前 `View.layer` 的 `[view.layer setNeedsDisplay]`方法。 4 | 5 | 这等于给当前的 `layer` 打上了一个脏标记,而此时并没有直接进行绘制工作。而是会到当前的 `Runloop` 即将休眠,也就是 `beforeWaiting` 时才会进行绘制工作。 6 | 7 | 紧接着会调用 `[CALayer display]`,进入到真正绘制的工作。`CALayer` 层会判断自己的 `delegate` 有没有实现异步绘制的代理方法 `displayer:`,这个代理方法是异步绘制的入口,如果没有实现这个方法,那么会继续进行系统绘制的流程,然后绘制结束。 8 | 9 | 过程可以用下面这张图来解释: 10 | 11 | ![](http://okhqmtd8q.bkt.clouddn.com/UIView%E7%BB%98%E5%88%B6%E5%8E%9F%E7%90%86.png) 12 | 13 | `CALayer` 内部会创建一个 `Backing Store`,用来获取图形上下文。接下来会判断这个 `layer` 是否有 delegate。 14 | 15 | 如果有的话,会调用 `[layer.delegate drawLayer:inContext:]`,并且会返回给我们 `[UIView DrawRect:]` 的回调,让我们在系统绘制的基础之上再做一些事情。 16 | 17 | 如果没有 `delegate`,那么会调用 `[CALayer drawInContext:]`。 18 | 19 | 以上两个分支,最终 `CALayer` 都会将位图提交到 `Backing Store`,最后提交给 `GPU`。 20 | 21 | 至此绘制的过程结束。 22 | 23 | ![](http://okhqmtd8q.bkt.clouddn.com/UIView%E7%BB%98%E5%88%B6%E5%8E%9F%E7%90%861.png) 24 | 25 | -------------------------------------------------------------------------------- /Runloop/14.第十四题.md: -------------------------------------------------------------------------------- 1 | ## 14.如何使用 `Runloop` 实现一个常驻线程?这种线程一般有什么作用? 2 | 3 | 4 | 一般做法是向 `Runloop` 中放一个 `port`。 5 | 6 | 7 | 创建一条常驻的后台线程,做任何你想做的事。 8 | 9 | 10 | -------------------------------------------------------------------------------- /Runloop/15.第十五题.md: -------------------------------------------------------------------------------- 1 | ## 15.为什么 `NSTimer` 有时候不好使? 2 | 3 | 因为创建的 `NSTimer` 默认是被加入到了 `defaultMode`,所以当 `Runloop` 的 `Mode` 变化时,当前的 `NSTimer` 就不会工作了。 4 | 5 | -------------------------------------------------------------------------------- /Runloop/16.第十六题.md: -------------------------------------------------------------------------------- 1 | ## 16.`PerformSelector:afterDelay:`这个方法在子线程中是否起作用?为什么?怎么解决? 2 | 3 | 不起作用,子线程默认没有 `Runloop`,也就没有 `Timer`。 4 | 5 | 解决的办法是可以使用 `GCD` 来实现:`Dispatch_after` 6 | 7 | -------------------------------------------------------------------------------- /Runloop/17.第十七题.md: -------------------------------------------------------------------------------- 1 | ## 17.什么是异步绘制? 2 | 3 | > 异步绘制,就是可以在子线程把需要绘制的图形,提前在子线程处理好。将准备好的图像数据直接返给主线程使用,这样可以降低主线程的压力。 4 | 5 | 6 | ###### 异步绘制的过程 7 | 8 | 要通过系统的 `[view.delegate displayLayer:]` 这个入口来实现异步绘制。 9 | 10 | - 代理负责生成对应的 Bitmap 11 | - 设置该 Bitmap 为 layer.contents 属性的值。 12 | 13 | 14 | 整个过程可以通过一张图来说明 15 | 16 | ![](http://okhqmtd8q.bkt.clouddn.com/%E5%BC%82%E6%AD%A5%E7%BB%98%E5%88%B6%E5%8E%9F%E7%90%86.png) 17 | 18 | -------------------------------------------------------------------------------- /Runloop/18.第十八题.md: -------------------------------------------------------------------------------- 1 | ## 18.如何检测 `App` 运行过程中是否卡顿? 2 | 3 | 4 | -------------------------------------------------------------------------------- /Runloop/19.第十九题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /Runloop/2.第二题.md: -------------------------------------------------------------------------------- 1 | 2 | ## 2.讲一下 `Runloop` 的 `Mode`?(越详细越好) 3 | 4 | - 一共有5个 `Mode`,常用的有仨,其中一个是占位用的。 5 | 6 | - `Mode` 里面有一个或者多个 `Source`、`timer`、 `Observer`。 7 | - `Source`事件源,分 0 和 1;本质就是函数回调 8 | - `timer` 就是计时器 9 | - `Observer` 顾名思义观察者 10 | 11 | - 'Mode' 的切换 12 | 13 | 14 | -------------------------------------------------------------------------------- /Runloop/20.第二十题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /Runloop/21.第二十一题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /Runloop/22.第二十二题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /Runloop/23.第二十三题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /Runloop/3.第三题.md: -------------------------------------------------------------------------------- 1 | ## 3.讲一下 `Observer` ? 2 | 3 | ```objc 4 | typedef CF_OPTIONS(CFOptionFlags, CFRunLoopActivity) { 5 | kCFRunLoopEntry = (1UL << 0), // 即将进入Loop 6 | kCFRunLoopBeforeTimers = (1UL << 1), // 即将处理 Timer 7 | kCFRunLoopBeforeSources = (1UL << 2), // 即将处理 Source 8 | kCFRunLoopBeforeWaiting = (1UL << 5), // 即将进入休眠 9 | kCFRunLoopAfterWaiting = (1UL << 6), // 刚从休眠中唤醒 10 | kCFRunLoopExit = (1UL << 7), // 即将退出Loop 11 | }; 12 | ``` 13 | 14 | -------------------------------------------------------------------------------- /Runloop/4.第四题.md: -------------------------------------------------------------------------------- 1 | ## 4.讲一下 `Runloop` 的内部实现逻辑 2 | 3 | ![](http://okhqmtd8q.bkt.clouddn.com/294992146@qq.comRunLoop_1.png) 4 | 5 | 6 | -------------------------------------------------------------------------------- /Runloop/5.第五题.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /Runloop/6.第六题.md: -------------------------------------------------------------------------------- 1 | 6.`autoreleasePool` 在何时被释放? 2 | 3 | `App`启动后,苹果在主线程 `RunLoop` 里注册了两个 `Observer`,其回调都是 `_wrapRunLoopWithAutoreleasePoolHandler()`。 4 | 5 | 第一个 `Observer` 监视的事件是 `Entry(即将进入Loop)`,其回调内会调用 `_objc_autoreleasePoolPush()` 创建自动释放池。其 `order` 是 `-2147483647`,优先级最高,保证创建释放池发生在其他所有回调之前。 6 | 7 | 第二个 `Observer` 监视了两个事件: `BeforeWaiting`(准备进入休眠) 时调用`_objc_autoreleasePoolPop()` 和 `_objc_autoreleasePoolPush()` 释放旧的池并创建新池;`Exit`(即将退出Loop) 时调用 `_objc_autoreleasePoolPop()` 来释放自动释放池。这个 `Observer` 的 `order` 是 `2147483647`,优先级最低,保证其释放池子发生在其他所有回调之后。 8 | 9 | 在主线程执行的代码,通常是写在诸如事件回调、`Timer`回调内的。这些回调会被 `RunLoop` 创建好的 `AutoreleasePool` 环绕着,所以不会出现内存泄漏,开发者也不必显示创建 `Pool` 了。 10 | 11 | 12 | -------------------------------------------------------------------------------- /Runloop/7.第七题.md: -------------------------------------------------------------------------------- 1 | ## 7.解释一下 `事件响应` 的过程? 2 | 3 | 苹果注册了一个 `Source1` (基于 `mach port` 的) 用来接收系统事件,其回调函数为 `__IOHIDEventSystemClientQueueCallback()`。 4 | 5 | 当一个硬件事件(触摸/锁屏/摇晃等)发生后,首先由 `IOKit.framework` 生成一个 `IOHIDEvent` 事件并由 `SpringBoard` 接收。这个过程的详细情况可以参考这里。`SpringBoard` 只接收按键(锁屏/静音等),触摸,加速,接近传感器等几种 `Event`,随后用 `mach port` 转发给需要的 `App` 进程。随后苹果注册的那个 `Source1` 就会触发回调,并调用 `_UIApplicationHandleEventQueue()` 进行应用内部的分发。 6 | 7 | `_UIApplicationHandleEventQueue()` 会把 `IOHIDEvent` 处理并包装成 `UIEvent` 进行处理或分发,其中包括识别 `UIGesture`/处理屏幕旋转/发送给 `UIWindow` 等。通常事件比如 `UIButton 点击`、`touchesBegin/Move/End/Cancel` 事件都是在这个回调中完成的。 8 | 9 | -------------------------------------------------------------------------------- /Runloop/8.第八题.md: -------------------------------------------------------------------------------- 1 | ## 8.解释一下 `手势识别` 的过程? 2 | 3 | 当上面的 `_UIApplicationHandleEventQueue() `识别了一个手势时,其首先会调用 `Cancel` 将当前的 `touchesBegin/Move/End` 系列回调打断。随后系统将对应的 `UIGestureRecognizer` 标记为待处理。 4 | 5 | 苹果注册了一个 `Observer` 监测 `BeforeWaiting` (Loop即将进入休眠) 事件,这个 `Observer` 的回调函数是 `_UIGestureRecognizerUpdateObserver()`,其内部会获取所有刚被标记为待处理的 `GestureRecognizer`,并执行`GestureRecognizer` 的回调。 6 | 7 | 当有 `UIGestureRecognizer` 的变化(创建/销毁/状态改变)时,这个回调都会进行相应处理。 8 | 9 | 10 | -------------------------------------------------------------------------------- /Runloop/9.第九题.md: -------------------------------------------------------------------------------- 1 | ## 9.解释一下 `GCD` 在 `Runloop` 中的使用? 2 | 3 | `GCD`由 子线程 返回到 主线程,只有在这种情况下才会触发 RunLoop。会触发 RunLoop 的 Source 1 事件。 4 | 5 | -------------------------------------------------------------------------------- /Runtime/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liberalisman/iOS-InterviewQuestion-collection/c91a492ab4f90538373a62579f43021546f55329/Runtime/.DS_Store -------------------------------------------------------------------------------- /Runtime/1.第一题.md: -------------------------------------------------------------------------------- 1 | 1.实例对象的数据结构? 2 | 3 | 具体可以参看 `Runtime` 源代码,在文件 `objc-private.h` 的第 `127-232` 行。 4 | 5 | ``` 6 | struct objc_object { 7 | isa_t isa; 8 | //... 9 | } 10 | ``` 11 | 12 | 本质上 `objc_object` 的私有属性只有一个 `isa` 指针。指向 `类对象` 的内存地址。 13 | 14 | -------------------------------------------------------------------------------- /Runtime/11.第十一题.md: -------------------------------------------------------------------------------- 1 | ## `Obj-C` 中的类信息存放在哪里? 2 | 3 | 4 | 类方法存储在元类。 5 | 6 | - 对象方法、属性、成员变量、协议等存放在 Class 对象中。 7 | - 类方法存放在 meta-class 对象中。 8 | - 成员变量的具体指,存放在 instance 对象中。 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /Runtime/13.第十三题.md: -------------------------------------------------------------------------------- 1 | 13.说一下对 `class_rw_t` 的理解? 2 | 3 | `rw`代表可读可写。 4 | 5 | `ObjC` 类中的属性、方法还有遵循的协议等信息都保存在 `class_rw_t` 中: 6 | 7 | ```objc 8 | // 可读可写 9 | struct class_rw_t { 10 | // Be warned that Symbolication knows the layout of this structure. 11 | uint32_t flags; 12 | uint32_t version; 13 | 14 | const class_ro_t *ro; // 指向只读的结构体,存放类初始信息 15 | 16 | /* 17 | 这三个都是二位数组,是可读可写的,包含了类的初始内容、分类的内容。 18 | methods中,存储 method_list_t ----> method_t 19 | 二维数组,method_list_t --> method_t 20 | 这三个二位数组中的数据有一部分是从class_ro_t中合并过来的。 21 | */ 22 | method_array_t methods; // 方法列表(类对象存放对象方法,元类对象存放类方法) 23 | property_array_t properties; // 属性列表 24 | protocol_array_t protocols; //协议列表 25 | 26 | Class firstSubclass; 27 | Class nextSiblingClass; 28 | 29 | //... 30 | } 31 | ``` 32 | 33 | -------------------------------------------------------------------------------- /Runtime/14.第十四题.md: -------------------------------------------------------------------------------- 1 | 14.说一下对 `class_ro_t` 的理解? 2 | 3 | 存储了当前类在编译期就已经确定的属性、方法以及遵循的协议。 4 | 5 | 6 | ```objc 7 | struct class_ro_t { 8 | uint32_t flags; 9 | uint32_t instanceStart; 10 | uint32_t instanceSize; 11 | uint32_t reserved; 12 | 13 | const uint8_t * ivarLayout; 14 | 15 | const char * name; 16 | method_list_t * baseMethodList; 17 | protocol_list_t * baseProtocols; 18 | const ivar_list_t * ivars; 19 | 20 | const uint8_t * weakIvarLayout; 21 | property_list_t *baseProperties; 22 | }; 23 | ``` 24 | 25 | `baseMethodList`,`baseProtocols`,`ivars`,`baseProperties`三个都是以为数组。 26 | 27 | 28 | -------------------------------------------------------------------------------- /Runtime/16.第十六题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /Runtime/17.第十七题.md: -------------------------------------------------------------------------------- 1 | ## 17.如何运用 `Runtime` 字典转模型? 2 | 3 | 4 | `Runtime` 遍历 `ivar_list`,结合 `KVC` 赋值。 5 | 6 | 7 | -------------------------------------------------------------------------------- /Runtime/18.第十八题.md: -------------------------------------------------------------------------------- 1 | ## 18.如何运用 `Runtime` 进行模型的归解档 2 | 3 | `Runtime` 遍历 `ivar_list`。 4 | 5 | -------------------------------------------------------------------------------- /Runtime/19.第十九题.md: -------------------------------------------------------------------------------- 1 | 19.在 `Obj-C` 中为什么叫发消息而不叫函数调用? 2 | 3 | 结合 `objc_msgsend` 讲一下,接收消息的过程。 4 | 5 | -------------------------------------------------------------------------------- /Runtime/2.第二题.md: -------------------------------------------------------------------------------- 1 | 2.类对象的数据结构? 2 | 3 | 具体可以参看 `Runtime` 源代码。 4 | 5 | > 类对象就是 `objc_class`。 6 | 7 | ``` 8 | struct objc_class : objc_object { 9 | // Class ISA; 10 | Class superclass; //父类指针 11 | cache_t cache; // formerly cache pointer and vtable 方法缓存 12 | class_data_bits_t bits; // class_rw_t * plus custom rr/alloc flags 用于获取地址 13 | 14 | class_rw_t *data() { 15 | return bits.data(); // &FAST_DATA_MASK 获取地址值 16 | } 17 | ``` 18 | 19 | 它的结构相对丰富一些。继承自`objc_object`结构体,所以包含`isa`指针 20 | 21 | - `isa`:指向元类 22 | - `superClass`: 指向父类 23 | - `Cache`: 方法的缓存列表 24 | - `data`: 顾名思义,就是数据。是一个被封装好的 `class_rw_t` 。 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /Runtime/20.第二十题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /Runtime/22.第二十二题.md: -------------------------------------------------------------------------------- 1 | ## 22.是否了解 `Type Encoding`? 2 | 3 | 不懂的可以看文档,中文名 - `类型编码`。 4 | 5 | https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtTypeEncodings.html 6 | 7 | -------------------------------------------------------------------------------- /Runtime/23.第二十三题.md: -------------------------------------------------------------------------------- 1 | ## 23.`Objective-C` 如何实现多重继承? 2 | 3 | 4 | `Objective-C` 只支持多层继承,不支持多重继承。想实现的话,可以使用协议。 5 | 6 | -------------------------------------------------------------------------------- /Runtime/24.第二十四题.md: -------------------------------------------------------------------------------- 1 | ## 24.`Category` 可不可以添加实例对象?为什么? 2 | 答案是不可以。 Category 的结构体内部没有容纳 Ivar 的数据结构。 3 | 4 | 有很详细的分析,具体可以看[这篇文章](https://www.jianshu.com/p/dcc3284b65bf) 5 | 6 | -------------------------------------------------------------------------------- /Runtime/25.第二十五题.md: -------------------------------------------------------------------------------- 1 | ## 25.`Obj-c`对象、类的本质是通过什么数据结构实现的? 2 | 3 | 结构体。 4 | 5 | 譬如一个最常见的 `Nsobject` 对象。将其编译为 `C++` 代码后,实际上就是一个 `Nsobject_Impl` 结构体。 -------------------------------------------------------------------------------- /Runtime/25.第二十五题的副本 3.md: -------------------------------------------------------------------------------- 1 | ## 25.`Obj-c`对象、类的本质是通过什么数据结构实现的? 2 | 3 | 结构体。 4 | 5 | 譬如一个最常见的 `Nsobject` 对象。将其编译为 `C++` 代码后,实际上就是一个 `Nsobject_Impl` 结构体。 -------------------------------------------------------------------------------- /Runtime/25.第二十五题的副本 4.md: -------------------------------------------------------------------------------- 1 | ## 25.`Obj-c`对象、类的本质是通过什么数据结构实现的? 2 | 3 | 结构体。 4 | 5 | 譬如一个最常见的 `Nsobject` 对象。将其编译为 `C++` 代码后,实际上就是一个 `Nsobject_Impl` 结构体。 -------------------------------------------------------------------------------- /Runtime/25.第二十五题的副本.md: -------------------------------------------------------------------------------- 1 | ## 25.`Obj-c`对象、类的本质是通过什么数据结构实现的? 2 | 3 | 结构体。 4 | 5 | 譬如一个最常见的 `Nsobject` 对象。将其编译为 `C++` 代码后,实际上就是一个 `Nsobject_Impl` 结构体。 -------------------------------------------------------------------------------- /Runtime/26.第二十六题.md: -------------------------------------------------------------------------------- 1 | ## 26.`Category` 在编译过后,是在什么时机与原有的类合并到一起的? 2 | 3 | 1. 程序启动后,通过编译之后,Runtime 会进行初始化,调用 `_objc_init`。 4 | 2. 然后会 `map_images`。 5 | 3. 接下来调用 `map_images_nolock`。 6 | 4. 再然后就是 `read_images`,这个方法会读取所有的类的相关信息。 7 | 5. 最后是调用 `reMethodizeClass:`,这个方法是重新方法化的意思。 8 | 6. 在 `reMethodizeClass:` 方法内部会调用 **`attachCategories:`** ,这个方法会传入 Class 和 Category ,会将方法列表,协议列表等与原有的类合并。最后加入到 **`class_rw_t`** 结构体中。 -------------------------------------------------------------------------------- /Runtime/3.第三题.md: -------------------------------------------------------------------------------- 1 | 3.元类对象的数据结构? 2 | 3 | `元类对象` 和 `类对象` 数据结构是一致的的 ,参见第二题。 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /Runtime/4.第四题.md: -------------------------------------------------------------------------------- 1 | ## `Category` 的实现原理? 2 | 3 | > 被添加在了 `class_rw_t` 的对应结构里。 4 | 5 | `Category` 实际上是 `Category_t` 的结构体,在运行时,新添加的方法,都被以倒序插入到原有方法列表的最前面,所以不同的`Category`,添加了同一个方法,执行的实际上是最后一个。 6 | 7 | 拿方法列表举例,实际上是一个二维的数组。 8 | 9 | 10 | `Category` 如果翻看源码的话就会知道实际上是一个 `_catrgory_t` 的结构体。 11 | 12 | -- 13 | 例如我们在程序中写了一个 `Nsobject+Tools` 的分类,那么被编译为 `C++` 之后,实际上是: 14 | 15 | 16 | ```c++ 17 | static struct _catrgory_t _OBJC_$_CATEGORY_NSObject_$_Tools __attribute__ ((used,section),("__DATA,__objc__const")) 18 | { 19 | // name 20 | // class 21 | // instance method list 22 | // class method list 23 | // protocol list 24 | // properties 25 | } 26 | ``` 27 | 28 | 29 | `Category` 在刚刚编译完的时候,和原来的类是分开的,只有在程序运行起来后,通过 `Runtime` ,`Category` 和原来的类才会合并到一起。 30 | 31 | 32 | 33 | `mememove`,`memcpy`:这俩方法是位移、复制,简单理解就是原有的方法移动到最后,根根新开辟的控件,把前面的位置留给分类,然后分类中的方法,按照倒序依次插入,可以得出的结论就就是,越晚参与编译的分类,里面的方法才是生效的那个。 -------------------------------------------------------------------------------- /Runtime/5.第五题.md: -------------------------------------------------------------------------------- 1 | 5.如何给 `Category` 添加属性?关联对象以什么形式进行存储? 2 | 3 | 查看的是 `关联对象` 的知识点。 4 | 5 | 详细的说一下 `关联对象`。 6 | 7 | `关联对象` 以哈希表的格式,存储在一个全局的单例中。 8 | 9 | 10 | 11 | ```objc 12 | @interface NSObject (Extension) 13 | 14 | @property (nonatomic,copy ) NSString *name; 15 | 16 | @end 17 | 18 | 19 | @implementation NSObject (Extension) 20 | 21 | - (void)setName:(NSString *)name { 22 | 23 | objc_setAssociatedObject(self, @selector(name), name, OBJC_ASSOCIATION_COPY_NONATOMIC); 24 | } 25 | 26 | 27 | - (NSString *)name { 28 | 29 | return objc_getAssociatedObject(self,@selector(name)); 30 | } 31 | 32 | @end 33 | ``` 34 | 35 | -------------------------------------------------------------------------------- /Runtime/6.第六题.md: -------------------------------------------------------------------------------- 1 | ## 6.`Category` 有哪些用途? 2 | 3 | - 给系统类添加方法、属性(需要关联对象)。 4 | - 对某个类大量的方法,可以实现按照不同的名称归类。 5 | 6 | -------------------------------------------------------------------------------- /Runtime/7.第七题.md: -------------------------------------------------------------------------------- 1 | ## 7.`Category` 和 `Extension` 有什么区别 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | * 2.`类拓展` 不能给系统的类添加方法。 5 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Runtime/8.第八题.md: -------------------------------------------------------------------------------- 1 | 说一下 `Method Swizzling`? 说一下在实际开发中你在什么场景下使用过? 2 | 3 | 交换方法。 4 | 5 | 6 | 可以结合 `Aspect` 的使用一起说。 7 | 8 | 其实方法交换,应用于统计个页面停留时长,记录用户路径,Hook系统方法啥的。。。还有不少用途 9 | 10 | 11 | -------------------------------------------------------------------------------- /Runtime/9.第九题.md: -------------------------------------------------------------------------------- 1 | 9.如何实现动态添加方法和属性? 2 | 3 | 直接查 API 即可 4 | 5 | 6 | -------------------------------------------------------------------------------- /UIKit/1.第一题.md: -------------------------------------------------------------------------------- 1 | ## 1.`UIView` 和 `CALayer` 是什么关系? 2 | 3 | - `CALayer` 基于 `QuartzCore` 框架 4 | - `UIView` 基于 `UIKit` 框架 5 | 6 | 7 | `CALayer` 是继承自 `NSObject` 的,而 `UIView` 是继承自 `UIResponder` 的 8 | 9 | 10 | 11 | `UIView` 和 `CALayer` 算是相互补充的关系。 12 | 13 | `UIView` = `CALayer.delegate` 14 | 15 | `UIView` : 负责用户的交互事件。 16 | 17 | `CALayer`: 负责图像和动画的渲染。 18 | 19 | -------------------------------------------------------------------------------- /UIKit/10.第十题.md: -------------------------------------------------------------------------------- 1 | ## 10.`UIViewController` 的生命周期? 2 | 3 | 4 | 可以参考一下[这篇文章](https://www.jianshu.com/p/4a62c10a36f1) 5 | 6 | 7 | ```objc 8 | -[ViewController initWithCoder:] 9 | -[ViewController awakeFromNib] 10 | -[ViewController loadView] 11 | -[ViewController viewDidLoad] 12 | -[ViewController viewWillAppear:] 13 | -[ViewController viewWillLayoutSubviews] 14 | -[ViewController viewDidLayoutSubviews] 15 | -[ViewController viewDidAppear:] 16 | -[ViewController viewWillDisappear:] 17 | -[ViewController viewDidDisappear:] 18 | -[ViewController dealloc] 19 | -[ViewController didReceiveMemoryWarning] 20 | ``` 21 | 22 | 23 | -------------------------------------------------------------------------------- /UIKit/12.第十二题.md: -------------------------------------------------------------------------------- 1 | ## 12.`setNeedsDisplay` 和 `layoutIfNeeded` 两者是什么关系? 2 | 3 | 4 | `setNeedsDisplay` 是给当前的视图做了标记。 5 | 6 | `layoutIfNeeded` 查找是否有标记,如果有标记及立刻刷新。 7 | 8 | 只有这二者合起来使用,才会起到立刻刷新的效果。 -------------------------------------------------------------------------------- /UIKit/2.第二题.md: -------------------------------------------------------------------------------- 1 | ## 2.`Bounds` 和 `Frame` 的区别? 2 | 3 | - `Bounds`:一般是相对于自身来说的,是控件的内部尺寸。如果你修改了 `Bounds`,那么子控件的相对位置也会发生改变。 4 | 5 | - `Frame` :是相对于父控件来说的,是控件的外部尺寸。 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /UIKit/3.第三题.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /UIKit/4.第四题.md: -------------------------------------------------------------------------------- 1 | ## 4.`LoadView`方法了解吗? 2 | 3 | 自定义控制器的 `View`。可以在这个方法中做一些个性化的设置 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /UIKit/5.第五题.md: -------------------------------------------------------------------------------- 1 | ## 5.`UIButton` 的父类是什么?`UILabel` 的父类又是什么? 2 | 3 | 4 | 5 | * UIButton -> UIControl -> UIView -> UIResponder 6 | 7 | * UILabel -> UIView -> UIResponder 8 | 9 | 区别就在于 `UIControlState....`、`UIControlEvent.....` 10 | 11 | 12 | -------------------------------------------------------------------------------- /UIKit/6.第六题.md: -------------------------------------------------------------------------------- 1 | ## 6.实现一个控件,可以浮在任意界面的上层并支持拖动? 2 | 3 | 4 | 两个方面 5 | 6 | * 1.这个空间要添加在程序的主 `window` 上。 7 | * 2.随手指拖动更新位移 8 | 9 | -------------------------------------------------------------------------------- /UIKit/7.第七题.md: -------------------------------------------------------------------------------- 1 | 2 | ## 7.说一下控制器 `View` 的生命周期,一旦收到内存警告会如何处理? 3 | 4 | ![](https://camo.githubusercontent.com/6ea2fb065c49dd902e98207429e65f7a28ea6997/687474703a2f2f6f6b68716d746438712e626b742e636c6f7564646e2e636f6d2f696d6167652f6a70672f566965772545372539342539462545352539312542442545352539312541382545362539432539462e706e67) 5 | 6 | 7 | 8 | 当系统内存告急时,会接收到`didReceiveMemoryWarning`。 这是属于 `ViewController` 的方法,当`ViewController` 接收到`didReceiveMemoryWarning`,首先会判断当前的 `ViewController` 是否还显示在 `window`上,如果不在就会移除当前的 `ViewController`,销毁`ViewController` 上面的子控件,并执行 `ViewDidUnload` 方法。 9 | 10 | ![](https://camo.githubusercontent.com/54f277fad4123a0e4ab041d8c2b37177ecb5d6c6/687474703a2f2f6f6b68716d746438712e626b742e636c6f7564646e2e636f6d2f696d6167652f6a70672f4d656d6f72795761726e696e672e706e67) 11 | 12 | -------------------------------------------------------------------------------- /UIKit/9.第九题.md: -------------------------------------------------------------------------------- 1 | 2 | 10.说一下 `UIView` 的生命周期? 3 | 4 | 可以看一下[这篇文章](https://www.jianshu.com/p/9d98fad685c8) 5 | 6 | 7 | 要注意的是 `UIView` 上是否有子控件,以及子控件释放的时机。 8 | 9 | 10 | -------------------------------------------------------------------------------- /WebView/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liberalisman/iOS-InterviewQuestion-collection/c91a492ab4f90538373a62579f43021546f55329/WebView/.DS_Store -------------------------------------------------------------------------------- /WebView/1.第一题.md: -------------------------------------------------------------------------------- 1 | ## 1.说一下 `JS` 和 `OC` 互相调用的几种方式? 2 | 3 | 我所知的有三种: 4 | 5 | - 1.协议头拦截 6 | - 2.JavaScriptCore - JSExpert 7 | - 3.WKWebView - ContentController 8 | 9 | 10 | 与 `WebView` 相关的知识可以看一下[这篇文章](https://www.jianshu.com/p/870dba42ec15) 11 | 12 | -------------------------------------------------------------------------------- /WebView/2.第二题.md: -------------------------------------------------------------------------------- 1 | ## 2.在使用 `WKWedView` 时遇到过哪些问题? 2 | 3 | 4 | 之前不管遇到的还是没遇到的,都在这里了: https://mp.weixin.qq.com/s/rhYKLIbXOsUJC_n6dt9UfA 5 | 6 | 7 | -------------------------------------------------------------------------------- /代码管理/1.1-1.md: -------------------------------------------------------------------------------- 1 | ## 1.`git pull` 和 `git fetch` 的区别? 2 | 3 | 4 | [参考链接](https://blog.csdn.net/u011534057/article/details/77505770) 5 | 6 | 1.概括的讲 `git pull` = `git fetch` + `git merge` 7 | 8 | 9 | `git pull` 会将本地库更新至远程库的最新状态 由于本地库进行了更新,`HEAD` 也会相应的指向最新的`commit id`。 10 | 11 | 2.`git fetch` 的时候只是将 `remote` 的 `origin` 进行 `update` 但是并没有在 `local` 的 `branch` 进行 `merge`。 12 | 13 | ![](https://img-blog.csdn.net/20150104153019820?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYTE5ODgxMDI5/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center) 14 | 15 | -------------------------------------------------------------------------------- /代码管理/1.1-2.md: -------------------------------------------------------------------------------- 1 | ## 2.`git merge` 和 `git rebase` 的区别? 2 | 3 | 参考[这一篇文章](https://blog.csdn.net/wh_19910525/article/details/7554489)即可。 4 | 5 | 6 | -------------------------------------------------------------------------------- /代码管理/1.1-3.md: -------------------------------------------------------------------------------- 1 | ## 3.如何在本地新建一个分支,并 `push` 到远程服务器上? 2 | 3 | 1.加入我在本地新建了一个分支 4 | 5 | ```objc 6 | git checkout origin/master -b simple 7 | ``` 8 | 9 | 2.我在这个分支上新建了一些文件,要把这个分支推送到服务器上 10 | 11 | ```objc 12 | git push origin simple 13 | ``` 14 | 15 | 3.用git branch -av 查看服务器上的分支,会多出一个分支: 16 | 17 | ```objc 18 | origin/simple 19 | ``` 20 | 21 | 22 | -------------------------------------------------------------------------------- /代码管理/1.1-4.md: -------------------------------------------------------------------------------- 1 | ## 4.如果 `fork` 了一个别人的仓库,怎样与源仓库保持同步? 2 | 3 | 4 | 参考该[链接](https://blog.csdn.net/godwei_ding/article/details/78756688) 5 | 6 | 7 | ###### 1:fork源仓库 8 | ###### 2:clone到本地 9 | 10 | ```objc 11 | git clone git@github.com:username/repositoryname.git 12 | ``` 13 | 14 | 15 | ###### 3:添加源仓库路径 16 | 17 | ```objc 18 | git remote add upstream https://github.com/owername/pouch.git 19 | ``` 20 | 21 | ###### 4:源仓库路径设置 22 | 23 | ```objc 24 | git remote set-url --push upstream no-pushing 25 | ``` 26 | 27 | ###### 5:获取源仓库的最新commit 28 | 29 | ```objc 30 | git fetch upstream 31 | ``` 32 | 33 | ###### 6:将最新commit合并到本地 34 | 35 | ```objc 36 | git merge upstream/master 37 | ``` 38 | 39 | ###### 7:将本地代码pull到自己的github 40 | 41 | ```objc 42 | git pull 43 | ``` 44 | 45 | 这时三个仓库就已经保持同步了。 46 | 47 | 48 | 49 | -------------------------------------------------------------------------------- /代码管理/1.1-5.md: -------------------------------------------------------------------------------- 1 | ## 5.总结一下 `Git` 常用的命令? 2 | 3 | * 1.`git init`初始化一个 Git 仓库。 4 | * 2.`git add ` 添加文件 5 | * 3.`git status` 查看当前 Git 仓库的文件状态。 6 | * 4.`git diff` 查看一个文件前后有什么不同。 7 | * 5.`git commit -m '描述信息'` 提交文件及相关信息。 8 | * 6.`git checkout -- ...`:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改。 9 | * 7.`git log` 命令显示从最近到最远的提交日志。 10 | * 8.`git reset --hard HEAD^` 回退到上一个版本。 11 | * 9.`git reset --hard 1094a` 如果是错误回退,只要当前窗口还没有关闭,可以找到最新的 `commit id`,根据 `commit id` 还原。 12 | * 10.`git reflog` 可以用来记录你的每一次命令,即便是误操作,可以通过这个命令进行还原。 13 | * 11.`git checkout` 是切换分支的意思。 14 | * 12.`git reset HEAD ` 可以把暂存区的修改撤销掉(unstage) 15 | * 13.`git remote add origin 远程仓库地址` 将本地仓库与远程仓库关联 16 | * 14.`git push -u origin master` 会把本地的 `master` 分支内容推送的远程新的 `master` 分支,还会把本地的 `master` 分支和远程的 `master` 分支关联起来. 17 | * 15.`git merge xxx`合并指定分支到当前分支 18 | * 16.`git branch` 查看当前的所有分支。 19 | * 17.`git branch xxx`创建指定的分支。 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /代码管理/13.第十三题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /代码管理/14.第十四题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /代码管理/15.第十五题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /代码管理/16.第十六题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /代码管理/17.第十七题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /代码管理/18.第十八题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /代码管理/19.第十九题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /代码管理/20.第二十题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /代码管理/21.第二十一题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /代码管理/22.第二十二题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /代码管理/23.第二十三题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /代码管理/3.3-1.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /代码管理/3.3-2.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /代码管理/3.3-3.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | * 2.`分类` 不能给系统的类添加方法。 5 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 6 | 7 | -------------------------------------------------------------------------------- /代码管理/3.3-4.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /代码管理/3.3-5.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /代码管理/3.3-6.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /代码管理/3.3-7.md: -------------------------------------------------------------------------------- 1 | ## 7.如何使用 `CocoaPods` 集成远程私有库? 2 | 3 | ###### 1.建立一个远程的私有索引库 4 | 在 `GitLab` 建立一个私有的代码仓库,暂时可以将它理解为一个空白的容器。 5 | 6 | ###### 2.通过 pod repo add 添加索引库 7 | 8 | ```objc 9 | pod repo add GZQBaseRepo 仓库地址 10 | ``` 11 | 12 | ###### 3.创建远程私有代码库 13 | 14 | * 建立模板 15 | 16 | ```objc 17 | pod lib create 18 | ``` 19 | 20 | * 将外界需要集成的代码拷贝到 `Classes` 文件夹下。 21 | * 在 `Example` 路径下执行 `pod install` 安装 。 22 | * 将本地代码上传至 Git 服务器。 23 | * 对版本信息打上 `Tag`。 24 | 25 | ###### 4.修改 `podspec` 文件,进行本地和远程校验 26 | 27 | ```objc 28 | pod lib lint 本地校验 29 | pod spec lint 远程校验 30 | ``` 31 | 32 | ###### 5.将 `podspec` 文件 push 到远程私有索引库 33 | 34 | ```objc 35 | pod repo push 路径文件 xxxx.podspec 36 | ``` 37 | 38 | ###### 6.在本地 `Podfile` 中,同时引入新建的远程私有索引库 和 官方库即可安装使用 39 | 40 | -------------------------------------------------------------------------------- /代码管理/3.3-8.md: -------------------------------------------------------------------------------- 1 | ## 8.如果自己写的库需要依赖其他的三方库,该怎么办? 2 | 3 | 此时需要修改 `podspec` 文件,在 `s.dependency` 处添加需要以来的三方库即可。 4 | 5 | -------------------------------------------------------------------------------- /其他问题/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liberalisman/iOS-InterviewQuestion-collection/c91a492ab4f90538373a62579f43021546f55329/其他问题/.DS_Store -------------------------------------------------------------------------------- /其他问题/1.第一题.md: -------------------------------------------------------------------------------- 1 | ## 1.`load` 和 `Initialize` 的区别? 2 | 3 | 4 | 5 | ##### `initialize(初始化)` 方法和 `load(加载)` 调用时机 6 | * `+ initialize` 方法:苹果官方对这个方法有这样的一段描述:这个方法会在 第一次初始化这个类之前 被调用,我们用它来初始化静态变量。 7 | * `load` 方法会在加载类的时候就被调用,也就是应用启动的时候,在调用 `main` 函数之前会加载所有的类,也会调用每个类的 `load` 方法。 8 | 9 | * `initialize` 方法类似一个懒加载,如果没有使用这个类,那么系统默认不会去调用这个方法,且默认只加载一次; 10 | * `initialize` 的调用发生在 `+init` 方法之前,创建子类的时候,子类会去调用父类的 `initialize` 方法。 11 | 12 | 13 | -------------------------------------------------------------------------------- /其他问题/12.第十二题.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /其他问题/13.第十三题.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /其他问题/14.第十四题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /其他问题/15.第十五题.md: -------------------------------------------------------------------------------- 1 | ## 15.`UIButton` 的父类是什么?`UILabel` 的父类又是什么? 2 | 3 | 4 | 5 | * UIButton -> UIControl -> UIView -> UIResponder 6 | 7 | * UILabel -> UIView -> UIResponder 8 | 9 | 区别就在于 `UIControlState....`、`UIControlEvent.....` 10 | 11 | -------------------------------------------------------------------------------- /其他问题/16.第十六题.md: -------------------------------------------------------------------------------- 1 | ### 16.实现一个控件,可以浮在任意界面的上层并支持拖动? 2 | 3 | 4 | 两个方面 5 | 6 | * 1.这个空间要添加在程序的主 `window` 上。 7 | * 2.随手指拖动更新位移 8 | 9 | -------------------------------------------------------------------------------- /其他问题/17.第十七题.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /其他问题/18.第十八题.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /其他问题/19.第十九题.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /其他问题/2.第二题.md: -------------------------------------------------------------------------------- 1 | ## 2.`Designated Initializer`的规则? 2 | 3 | 1.[推荐一篇写的很好的文章](https://www.cnblogs.com/smileEvday/p/designated_initializer.html) 4 | 5 | 6 | 2.[这篇文章](https://www.jianshu.com/p/f92972bf7300)写得更简单易懂 7 | 8 | 9 | -------------------------------------------------------------------------------- /其他问题/20.第二十题.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /其他问题/21.第二十一题.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /其他问题/22.第二十二题.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /其他问题/23.第二十三题.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /其他问题/24.第二十四题.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /其他问题/25.第二十五题.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /其他问题/3.第三题.md: -------------------------------------------------------------------------------- 1 | ## 3.`App` 编译过程有了解吗? 2 | 3 | 4 | 可以参考[这篇文章](https://www.jianshu.com/p/65901441903e) 5 | 6 | ###### 一般会执行如下几个步骤: 7 | 8 | * 预处理 9 | * 语法和语义分析 10 | * 生成代码和优化 11 | * 汇编 12 | * 链接 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /其他问题/4.第四题.md: -------------------------------------------------------------------------------- 1 | ## 4.说一下对 `APNS` 的认识? 2 | 3 | 我写过三篇关于推送框架的总结: 4 | 5 | * 第一篇:http://xiaolu520.com/2017/06/08/WWDC2016-Session707%EF%BC%88UNNotifications%EF%BC%89/ 6 | * 第二篇:http://xiaolu520.com/2017/06/09/WWDC2016-Session708%EF%BC%88%E9%AB%98%E7%BA%A7%E9%80%9A%E7%9F%A5%EF%BC%89/ 7 | * 第三篇:http://xiaolu520.com/2017/06/12/WWDC2016-Session724%EF%BC%88APNS%E6%96%B0%E7%89%B9%E6%80%A7%EF%BC%89/ 8 | 9 | 以前的通知基于 `Socket` ,但是不稳定。新的通知框架基于 `Http` 。 10 | 11 | 设备的唯一识别码,程序的BundleID,通过长连接发给 `APNS` 服务器,返回一个 `DeviceToken`。把这个 `DeviceToken` 发给服务器,以后服务器把 `DeviceToken` 和 通知的内容发给 `APNS` 就可以了。 12 | 13 | 14 | -------------------------------------------------------------------------------- /内存管理/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liberalisman/iOS-InterviewQuestion-collection/c91a492ab4f90538373a62579f43021546f55329/内存管理/.DS_Store -------------------------------------------------------------------------------- /内存管理/1.第一题.md: -------------------------------------------------------------------------------- 1 | ## 讲一下 `iOS` 内存管理的理解 2 | 3 | 实际上是三种方案的结合 4 | 5 | * 1.TaggedPointer(针对类似于 `NSNumber` 的小对象类型) 6 | * 2.NONPOINTER_ISA(64位系统下) 7 | - 第一位的 `0` 或 `1` 代表是纯地址型 `isa` 指针,还是 `NONPOINTER_ISA` 指针。 8 | - 第二位,代表是否有关联对象 9 | - 第三位代表是否有 `C++` 代码。 10 | - 接下来33位代表指向的内存地址 11 | - 接下来有 `弱引用` 的标记 12 | - 接下来有是否 `delloc` 的标记....等等 13 | * 3.散列表(引用计数表、weak表) 14 | - `SideTables` 表在 非嵌入式的64位系统中,有 64张 `SideTable` 表 15 | - 每一张 `SideTable` 主要是由三部分组成。`自旋锁`、`引用计数表`、`弱引用表`。 16 | - 全局的 `引用计数` 之所以不存在同一张表中,是为了避免资源竞争,解决效率的问题。 17 | - `引用计数表` 中引入了 `分离锁`的概念,将一张表分拆成多个部分,对他们分别加锁,可以实现并发操作,提升执行效率 18 | 19 | -------------------------------------------------------------------------------- /内存管理/10.第十题.md: -------------------------------------------------------------------------------- 1 | ## 10.说一下对 `retain`,`copy`,`assign`,`weak`,`_Unsafe_Unretain` 关键字的理解。 2 | 3 | 4 | ###### Strong 5 | > `Strong` 修饰符表示指向并持有该对象,其修饰对象的引用计数会加1。该对象只要引用计数不为0就不会被销毁。当然可以通过将变量强制赋值 `nil` 来进行销毁。 6 | 7 | 8 | ###### Weak 9 | > `weak` 修饰符指向但是并不持有该对象,引用计数也不会加1。在 `Runtime` 中对该属性进行了相关操作,无需处理,可以自动销毁。`weak`用来修饰对象,多用于避免循环引用的地方。`weak` 不可以修饰基本数据类型。 10 | 11 | ###### assign 12 | > `assign`主要用于修饰基本数据类型, 13 | 例如`NSInteger`,`CGFloat`,存储在栈中,内存不用程序员管理。`assign`是可以修饰对象的,但是会出现问题。 14 | 15 | 16 | ###### copy 17 | > `copy`关键字和 `strong`类似,`copy` 多用于修饰有可变类型的不可变对象上 `NSString`,`NSArray`,`NSDictionary`上。 18 | 19 | ###### __unsafe_unretain 20 | > `__unsafe_unretain` 类似于 `weak` ,但是当对象被释放后,指针已然保存着之前的地址,被释放后的地址变为 `僵尸对象`,访问被释放的地址就会出问题,所以说他是不安全的。 21 | 22 | ###### __autoreleasing 23 | > 将对象赋值给附有 `__autoreleasing`修饰的变量等同于 `ARC` 无效时调用对象的 `autorelease` 方法,实质就是扔进了自动释放池。 24 | 25 | -------------------------------------------------------------------------------- /内存管理/11.第十一题.md: -------------------------------------------------------------------------------- 1 | ## 11.`ARC` 在编译时做了哪些工作 2 | 3 | 根据代码执行的上下文语境,在适当的位置插入 `retain`,`release` 4 | 5 | 6 | -------------------------------------------------------------------------------- /内存管理/12.第十二题.md: -------------------------------------------------------------------------------- 1 | ## 12.`ARC` 在运行时做了哪些工作? 2 | 3 | - 主要是指 `weak` 关键字。`weak` 修饰的变量能够在引用计数为`0` 时被自动设置成 `nil`,显然是有运行时逻辑在工作的。 4 | 5 | 6 | - 为了保证向后兼容性,`ARC` 在运行时检测到类函数中的 `autorelease` 后紧跟其后 `retain`,此时不直接调用对象的 `autorelease` 方法,而是改为调用 `objc_autoreleaseReturnValue`。 7 | `objc_autoreleaseReturnValue` 会检视当前方法返回之后即将要执行的那段代码,若那段代码要在返回对象上执行 `retain` 操作,则设置全局数据结构中的一个标志位,而不执行 `autorelease` 操作,与之相似,如果方法返回了一个自动释放的对象,而调用方法的代码要保留此对象,那么此时不直接执行 `retain` ,而是改为执行 `objc_retainAoutoreleasedReturnValue`函数。此函数要检测刚才提到的标志位,若已经置位,则不执行 `retain` 操作,设置并检测标志位,要比调用 `autorelease` 和`retain `更快。 8 | 9 | -------------------------------------------------------------------------------- /内存管理/13.第十三题.md: -------------------------------------------------------------------------------- 1 | ## 13.函数返回一个对象时,会对对象 `autorelease` 么?为什么? 2 | 3 | 会 ,为了延长返回对象的生命周期,给其他使用者留足调用的时间 4 | 5 | 6 | -------------------------------------------------------------------------------- /内存管理/14.第十四题.md: -------------------------------------------------------------------------------- 1 | ## 14.说一下什么是 `悬垂指针`?什么是 `野指针`? 2 | 3 | 4 | ###### 悬垂指针 5 | > 指针指向的内存已经被释放了,但是指针还存在,这就是一个 `悬垂指针` 或者说 `迷途指针` 6 | 7 | ###### 野指针 8 | > 没有进行初始化的指针,其实都是 `野指针` 9 | 10 | -------------------------------------------------------------------------------- /内存管理/15.第十五题.md: -------------------------------------------------------------------------------- 1 | 15.内存管理默认的关键字是什么? 2 | 3 | 4 | ###### MRC 5 | 6 | ```OBJC 7 | @property (atomic,readWrite,retain) UIView *view; 8 | ``` 9 | 10 | ###### ARC 11 | 12 | ```OBJC 13 | @property (atomic,readWrite,strong) UIView *view; 14 | ``` 15 | 16 | 如果改为基本数据类型,那就是 `assign`。 17 | 18 | -------------------------------------------------------------------------------- /内存管理/16.第十六题.md: -------------------------------------------------------------------------------- 1 | ## 16.内存中的5大区分别是什么? 2 | 3 | 4 | - 栈区(stack):由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其 操作方式类似于数据结构中的栈。 5 | - 堆区(heap):一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。 6 | - 全局区(静态区)(static):全局变量和静态变量的存储是放在一块的,初始化的 全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后由系统释放。 7 | - 文字常量区:常量字符串就是放在这里的。 程序结束后由系统释放。 8 | - 程序代码区:存放函数体的二进制代码。 9 | 10 | 11 | -------------------------------------------------------------------------------- /内存管理/17.第十七题.md: -------------------------------------------------------------------------------- 1 | ## 17.是否了解 `深拷贝` 和 `浅拷贝` 的概念,集合类深拷贝如何实现 2 | 3 | `深拷贝`内存拷贝 4 | `浅拷贝`指针拷贝 5 | 6 | **浅拷贝** 7 | 浅拷贝: 将原对象或原数组的引用直接赋给新对象,新数组,新对象/数组只是原对象的一个引用 8 | 9 | **深拷贝** 10 | 深拷贝: 创建一个新的对象和数组,将原对象的各项属性的“值”(数组的所有元素)拷贝过来,是“值”而不是“引用” 11 | 12 | 对OC中的不可变对象/可变对象进行copy/mutableCopy分别是什么拷贝 13 | 14 | 15 | 16 | 17 | 18 | **总结** 19 | 20 | 21 | 22 | 23 | **集合类深拷贝通过归档、解档实现。** 24 | 25 | -------------------------------------------------------------------------------- /内存管理/18.第十八题.md: -------------------------------------------------------------------------------- 1 | ## 18.`BAD_ACCESS` 在什么情况下出现? 2 | 3 | 访问了已经被销毁的内存空间,就会报出这个错误。 4 | 根本原因是有 `悬垂指针` 没有被释放。 5 | 6 | 7 | -------------------------------------------------------------------------------- /内存管理/19.第十九题.md: -------------------------------------------------------------------------------- 1 | ## 19.讲一下 `@dynamic` 关键字? 2 | 3 | 4 | `@dynamic` 意味着编译器不会帮助我们自动合成 `setter` 和 `getter` 方法。我们需要手动实现、这里就涉及到 `Runtime` 的动态添加方法的知识点。 5 | 6 | -------------------------------------------------------------------------------- /内存管理/2.第二题.md: -------------------------------------------------------------------------------- 1 | ## 使用自动引用计数应遵循的原则 2 | 3 | - 不能使用 `retain`、`release`、`retainCount`、`autorelease`。 4 | - 不可以使用 `NSAllocateObject`、`NSDeallocateObject`。 5 | - 必须遵守内存管理方法的命名规则。 6 | - 不需要显示的调用 `Dealloc`。 7 | - 使用 `@autoreleasePool` 来代替 `NSAutoreleasePool`。 8 | - 不可以使用区域 `NSZone`。 9 | - 对象性变量不可以作为 `C` 语言的结构体成员。 10 | - 显示转换 `id` 和 `void*`。 11 | 12 | -------------------------------------------------------------------------------- /内存管理/20.第二十题.md: -------------------------------------------------------------------------------- 1 | ## 20 `autoReleasePool` 什么时候释放? 2 | 3 | `App`启动后,苹果在主线程 `RunLoop` 里注册了两个 `Observer`,其回调都是 `_wrapRunLoopWithAutoreleasePoolHandler()`。 4 | 5 | 第一个 `Observer` 监视的事件是 `Entry(即将进入Loop)`,其回调内会调用 `_objc_autoreleasePoolPush()` 创建自动释放池。其 `order` 是 `-2147483647`,优先级最高,保证创建释放池发生在其他所有回调之前。 6 | 7 | 第二个 `Observer` 监视了两个事件: `BeforeWaiting`(准备进入休眠) 时调用`_objc_autoreleasePoolPop()` 和 `_objc_autoreleasePoolPush()` 释放旧的池并创建新池;`Exit`(即将退出Loop) 时调用 `_objc_autoreleasePoolPop()` 来释放自动释放池。这个 `Observer` 的 `order` 是 `2147483647`,优先级最低,保证其释放池子发生在其他所有回调之后。 8 | 9 | 在主线程执行的代码,通常是写在诸如事件回调、`Timer`回调内的。这些回调会被 `RunLoop` 创建好的 `AutoreleasePool` 环绕着,所以不会出现内存泄漏,开发者也不必显示创建 `Pool` 了。 10 | 11 | 12 | -------------------------------------------------------------------------------- /内存管理/21.第二十一题.md: -------------------------------------------------------------------------------- 1 | ## 21.`retain`、`release` 的实现机制? 2 | 3 | 4 | #### 1.`Retain`的实现机制。 5 | 6 | ```c 7 | SideTable& table = SideTables()[This]; 8 | 9 | size_t& refcntStorage = table.refcnts[This]; 10 | 11 | refcntStorage += SIZE_TABLE_RC_ONE; 12 | ``` 13 | 14 | 15 | 16 | 17 | #### 2.`Release`的实现机制。 18 | 19 | ```c 20 | SideTable& table = SideTables()[This]; 21 | 22 | size_t& refcntStorage = table.refcnts[This]; 23 | 24 | refcntStorage -= SIZE_TABLE_RC_ONE; 25 | ``` 26 | 27 | 28 | 29 | 二者的实现机制类似,概括讲就是通过第一层 `hash` 算法,找到 `指针变量` 所对应的 `sideTable`。然后再通过一层 `hash` 算法,找到存储 `引用计数` 的 `size_t`,然后对其进行增减操作。`retainCount` 不是固定的 1,`SIZE_TABLE_RC_ONE` 是一个宏定义,实际上是一个值为 4 的偏移量。 30 | 31 | 32 | -------------------------------------------------------------------------------- /内存管理/23.第二十三题.md: -------------------------------------------------------------------------------- 1 | ## 23.在 `MRC` 下如何重写属性的 `Setter` 和 `Getter`? 2 | 3 | ###### setter 4 | ```objc 5 | -(void)setBrand:(NSString *)brand{ 6 | //如果实例变量指向的地址和参数指向的地址不同 7 | if (_brand != brand) 8 | { 9 | //将实例变量的引用计数减一 10 | [_brand release]; 11 | //将参数变量的引用计数加一,并赋值给实例变量 12 | _brand = [brand retain]; 13 | } 14 | } 15 | ``` 16 | 17 | 18 | ###### getter 19 | 20 | ```objc 21 | -(NSString *)brand{ 22 | //将实例变量的引用计数加1后,添加自动减1 23 | //作用,保证调用getter方法取值时可以取到值的同时在完全不需要使用后释放 24 | return [[_brand retain] autorelease]; 25 | } 26 | ``` 27 | 28 | ###### 重写dealloc 29 | 30 | ```objc 31 | //MRC下 手动释放内存 可重写dealloc但不要调用dealloc 会崩溃 32 | -(void)dealloc{ 33 | [_string release]; 34 | //必须最后调用super dealloc 35 | [super dealloc]; 36 | } 37 | ``` 38 | 39 | 40 | -------------------------------------------------------------------------------- /内存管理/24.第二十四题.md: -------------------------------------------------------------------------------- 1 | ## 24.在 `Obj-C` 中,如何检测内存泄漏?你知道哪些方式? 2 | 目前我知道的方式有以下几种 3 | 4 | * Memory Leaks 5 | * Alloctions 6 | * Analyse 7 | * Debug Memory Graph 8 | * MLeaksFinder 9 | 10 | 11 | 12 | 泄露的内存主要有以下两种: 13 | 14 | * `Laek Memory` 这种是忘记 `Release` 操作所泄露的内存。 15 | * `Abandon Memory` 这种是循环引用,无法释放掉的内存。 16 | 17 | 18 | 上面所说的五种方式,其实前四种都比较麻烦,需要不断地调试运行,第五种是腾讯阅读团队出品,效果好一些,感兴趣的可以看一下这两篇文章: 19 | 20 | - [MLeaksFinder:精准 iOS 内存泄露检测工具](http://wereadteam.github.io/2016/02/22/MLeaksFinder/) 21 | - [MLeaksFinder 新特性](http://wereadteam.github.io/2016/07/20/MLeaksFinder2/) 22 | 23 | -------------------------------------------------------------------------------- /内存管理/3.第三题.md: -------------------------------------------------------------------------------- 1 | ## 3.ARC自动内存管理的原则 2 | 3 | - 自己生成的对象,自己持有 4 | - 非自己生成的对象,自己可以持有 5 | - 自己持有的对象不再需要时,需要对其进行释放 6 | - 非自己持有的对象无法释放 7 | 8 | 9 | -------------------------------------------------------------------------------- /内存管理/4.第四题.md: -------------------------------------------------------------------------------- 1 | ## 4.访问 `__weak` 修饰的变量,是否已经被注册在了 `@autoreleasePool` 中?为什么? 2 | 3 | 4 | 答案是肯定的,`__weak`修饰的变量属于弱引用,如果没有被注册到 `@autoreleasePool` 中,创建之后也就会随之销毁,为了延长它的生命周期,必须注册到 `@autoreleasePool` 中,以延缓释放。 5 | 6 | -------------------------------------------------------------------------------- /内存管理/5.第五题.md: -------------------------------------------------------------------------------- 1 | ## 5.`ARC` 的 `retainCount` 怎么存储的? 2 | 3 | 存在64张哈希表中,根据哈希算法去查找所在的位置,无需遍历,十分快捷 4 | 5 | 散列表(引用计数表、weak表) 6 | - `SideTables` 表在 非嵌入式的64位系统中,有 64张 `SideTable` 表 7 | - 每一张 `SideTable` 主要是由三部分组成。`自旋锁`、`引用计数表`、`弱引用表`。 8 | - 全局的 `引用计数` 之所以不存在同一张表中,是为了避免资源竞争,解决效率的问题。 9 | - `引用计数表` 中引入了 `分离锁`的概念,将一张表分拆成多个部分,对他们分别加锁,可以实现并发操作,提升执行效率 10 | 11 | 12 | #### 引用计数表(哈希表) 13 | 14 | 通过指针的地址,查找到引用计数的地址,大大提升查找效率 15 | 16 | 通过 `DisguisedPtr(objc_object)` 函数存储,同时也通过这个函数查找,这样就避免了循环遍历。 17 | 18 | -------------------------------------------------------------------------------- /内存管理/6.第六题.md: -------------------------------------------------------------------------------- 1 | ## 6.简要说一下 `@autoreleasePool` 的数据结构? 2 | 3 | 简单说是双向链表,每张链表头尾相接,有 `parent`、`child`指针 4 | 5 | 每创建一个池子,会在首部创建一个 `哨兵` 对象,作为标记 6 | 7 | 最外层池子的顶端会有一个`next`指针。当链表容量满了,就会在链表的顶端,并指向下一张表。 8 | 9 | 10 | -------------------------------------------------------------------------------- /内存管理/7.第七题.md: -------------------------------------------------------------------------------- 1 | ## 7.`__weak` 和 `_Unsafe_Unretain` 的区别? 2 | 3 | weak 修饰的指针变量,在指向的内存地址销毁后,会在 `Runtime` 的机制下,自动置为 `nil`。 4 | 5 | `_Unsafe_Unretain`不会置为 `nil`,容易出现 `悬垂指针`,发生崩溃。但是 `_Unsafe_Unretain` 比 `__weak` 效率高。 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /内存管理/8.第八题.md: -------------------------------------------------------------------------------- 1 | ## 8.为什么已经有了 `ARC` ,但还是需要 `@AutoreleasePool` 的存在? 2 | 3 | 避免内存峰值,及时释放不需要的内存空间 4 | 5 | -------------------------------------------------------------------------------- /内存管理/9.第九题.md: -------------------------------------------------------------------------------- 1 | 2 | ## 9.`__weak` 属性修饰的变量,如何实现在变量没有强引用后自动置为 `nil` ? 3 | 4 | 用的弱引用 - `weak`表。也是一张 `哈希表`。 5 | 6 | 被 `weak` 修饰的指针变量所指向的地址是 `key` ,所有指向这块内存地址的指针会被添加在一个数组里,这个数组是 `Value`。当内存地址销毁,数组里的所有对象被置为 `nil`。 7 | 8 | -------------------------------------------------------------------------------- /图像处理/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liberalisman/iOS-InterviewQuestion-collection/c91a492ab4f90538373a62579f43021546f55329/图像处理/.DS_Store -------------------------------------------------------------------------------- /图像处理/1.第一题.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /图像处理/10.第十题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /图像处理/11.第十一题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /图像处理/12.第十二题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /图像处理/13.第十三题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /图像处理/14.第十四题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /图像处理/15.第十五题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /图像处理/16.第十六题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /图像处理/17.第十七题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /图像处理/18.第十八题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /图像处理/19.第十九题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /图像处理/2.第二题.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /图像处理/20.第二十题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /图像处理/21.第二十一题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /图像处理/22.第二十二题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /图像处理/23.第二十三题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /图像处理/3.第三题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /图像处理/4.第四题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /图像处理/5.第五题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /图像处理/6.第六题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /图像处理/7.第七题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | * 2.`分类` 不能给系统的类添加方法。 5 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 6 | 7 | -------------------------------------------------------------------------------- /图像处理/8.第八题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /图像处理/9.第九题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /多线程/1.第一题.md: -------------------------------------------------------------------------------- 1 | ## 1.`NSThread`相关知识 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /多线程/10.第十题.md: -------------------------------------------------------------------------------- 1 | ## 10.同步锁 - `Synchronized(self) {// code}` 2 | 3 | 4 | `@synchronized(object)` 指令使用的 `object` 为该锁的唯一标识,只有当标识相同时,才满足互斥。 5 | 6 | 7 | `@synchronized(object)` 简化了加锁的行为,我们不在需要显示的加锁。 8 | 9 | 10 | -------------------------------------------------------------------------------- /多线程/11.第十一题.md: -------------------------------------------------------------------------------- 1 | 11.信号量 - `dispatch_semaphore`。 2 | 3 | > 如果获取不到 `锁` ,会将当前线程阻塞、休眠,直到其他线程释放 `锁` 时,会唤醒当前线程。 4 | 5 | -------------------------------------------------------------------------------- /多线程/12.第十二题.md: -------------------------------------------------------------------------------- 1 | ## 12.自旋锁 - `OSSpinLock` 2 | 3 | > 自旋锁是一种 “忙等” 的锁,它适用于轻量访问,譬如在 `引用计数表` 和 原子性`atomic`。 4 | 5 | 如果当前线程的 `锁` 被其他线程获取,当前线程会不断探测 `锁` 是否有被释放,如果检测出释放,会第一时间获取这个锁 6 | 7 | -------------------------------------------------------------------------------- /多线程/14.第十四题.md: -------------------------------------------------------------------------------- 1 | ## 14.分步锁 - `NSDistributedLock`。 2 | 3 | 在 引用计数表的数据结构里,一张 `sideTable` 表利用 `分离锁` 被分成了多个部分。 4 | 5 | 这样可以对一张表的多个部分,同时进行操作,提升了效率。 6 | 7 | 8 | -------------------------------------------------------------------------------- /多线程/15.第十五题.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | ## 14.如何确保线程安全? 4 | 5 | * 采用 `串行队列`。 6 | * 加上 `同步锁`。 7 | 8 | -------------------------------------------------------------------------------- /多线程/16.第十六题.md: -------------------------------------------------------------------------------- 1 | 2 | ## 15.`NSMutableArray`、和 `NSMutableDictionary`是线程安全的吗?`NSCache`呢? 3 | 4 | 5 | 6 | > 在做缓存时,优先使用 `NSCache` 而不是 `NSDictionary` ,我们熟悉的框架 `SDWebimage` 就是采用的 `NSCache`。 7 | 8 | `NSCache` 优点如下: 9 | 10 | 1. 系统资源将要耗尽时,它可以自动删减缓存。 11 | 2. 可以设置最大缓存数量。 12 | 3. 可以设置最大占用内存值。 13 | 4. `NSCache` 线程是安全的。 14 | 15 | 16 | -------------------------------------------------------------------------------- /多线程/17.第十七题.md: -------------------------------------------------------------------------------- 1 | ## 17.多线程的 `并行` 和 `并发` 有什么区别? 2 | 3 | 并行:充分利用计算机的多核,在多个线程上同步进行 4 | 并发:在一条线程上通过快速切换,让人感觉在同步进行 5 | 6 | -------------------------------------------------------------------------------- /多线程/18.第十八题.md: -------------------------------------------------------------------------------- 1 | ## 18.多线程有哪些优缺点? 2 | 3 | 4 | ##### 创建线程是需要花费资源的 5 | 6 | - 一条主线程占用1M,一条子线程占用 512Kb。 7 | - 线程的切换也是需要花费资源的 8 | - 优点就是提升效率,充分利用了计算机的多核特性。 9 | 10 | 11 | -------------------------------------------------------------------------------- /多线程/19.第十九题.md: -------------------------------------------------------------------------------- 1 | ## 19.如何自定义 `NSOperation` ? 2 | 3 | 4 | 需要重写其 `main` 方法 5 | 6 | 7 | -------------------------------------------------------------------------------- /多线程/20.第二十题.md: -------------------------------------------------------------------------------- 1 | ## 20.`GCD` 与 `NSOperationQueue` 有哪些异同? 2 | 3 | 4 | 5 | * 1> `GCD` 是纯 `C` 语言的 `API` 。`NSOperationQueue` 是基于 `GCD` 的 `OC` 的封装。 6 | * 2> `GCD` 只支持 `FIFO` 队列,`NSOperationQueue` 可以方便设置执行顺序,设置最大的并发数量。 7 | * 3> `NSOperationQueue` 可是方便的设置 `operation` 之间的依赖关系,`GCD` 则需要很多代码。 8 | * 4> `NSOperationQueue` 支持 `KVO`,可以检测 `operation` 是否正在执行`(isExecuted)`,是否结束`(isFinished)`,是否取消`(isCanceled)` 9 | * 5>GCD的执行速度比NSOperationQueue快。 10 | 11 | 12 | 13 | #### 使用场合: 14 | 15 | * 任务之间不太相互依赖:`GCD` 16 | 17 | * 任务之间有依赖或要监听任务的执行情况:`NSOperationQueue` 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /多线程/21.第二十一题.md: -------------------------------------------------------------------------------- 1 | ## 21.解释一下多线程中的死锁? 2 | 3 | 4 | 5 | 死锁是由于多个线程(进程)在执行过程中,因为争夺资源而造成的互相等待现象,你可以理解为卡主了。产生死锁的必要条件有四个: 6 | 7 | - 互斥条件 : 指进程对所分配到的资源进行排它性使用,即在一段时间内某资源只由一个进程占用。如果此时还有其它进程请求资源,则请求者只能等待,直至占有资源的进程用毕释放。 8 | - 请求和保持条件 : 指进程已经保持至少一个资源,但又提出了新的资源请求,而该资源已被其它进程占有,此时请求进程阻塞,但又对自己已获得的其它资源保持不放。 9 | - 不可剥夺条件 : 指进程已获得的资源,在未使用完之前,不能被剥夺,只能在使用完时由自己释放。 10 | - 环路等待条件 : 指在发生死锁时,必然存在一个进程——资源的环形链,即进程集合{P0,P1,P2,···,Pn}中的P0正在等待一个P1占用的资源;P1正在等待P2占用的资源,……,Pn正在等待已被P0占用的资源。 11 | 12 | 13 | ```objc 14 | dispatch_sync(dispatch_get_main_queue(), ^{ 15 | NSLog(@"2"); 16 | }); 17 | 18 | NSLog(@"1"); 19 | // 什么也不会打印,直接报错 20 | ``` 21 | 22 | 23 | 最常见的就是 `同步函数` + `主队列` 的组合,本质是队列阻塞。 24 | 25 | 26 | 有兴趣研究一下的可以参考[这篇文章](https://www.jianshu.com/p/bbabef8aa1fe),还有[这篇文章](https://juejin.im/post/5b1cf4fa6fb9a01e4b062771) 27 | 28 | -------------------------------------------------------------------------------- /多线程/22.第二十二题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /多线程/23.第二十三题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /多线程/3.第三题.md: -------------------------------------------------------------------------------- 1 | ## 3.`NSOperation` 和 `NSOperationQueue`相关知识? 2 | 3 | (最大并发数、线程依赖) 4 | 5 | -------------------------------------------------------------------------------- /多线程/4.第四题.md: -------------------------------------------------------------------------------- 1 | ## 4.如何实现线性编程? 2 | 3 | 信号量、栅栏、Dispatch_group 4 | 5 | -------------------------------------------------------------------------------- /多线程/5.第五题.md: -------------------------------------------------------------------------------- 1 | ## 5.说一下 `GCD` 并发队列实现机制? 2 | 3 | 4 | 利用的时间片轮转 5 | 6 | 7 | -------------------------------------------------------------------------------- /多线程/6.第六题.md: -------------------------------------------------------------------------------- 1 | ## 6.`NSLock` 2 | 3 | > `NSLock` 遵循 `NSLocking` 协议,`lock` 方法是加锁,`unlock` 是解锁,`tryLock` 是尝试加锁,如果失败的话返回 NO,`lockBeforeDate:` 是在指定 `Date` 之前尝试加锁,如果在指定时间之前都不能加锁,则返回 `NO`。 4 | 5 | ```objc 6 | @protocol NSLocking 7 | 8 | - (void)lock; 9 | - (void)unlock; 10 | 11 | @end 12 | 13 | @interface NSLock : NSObject { 14 | @private 15 | void *_priv; 16 | } 17 | 18 | - (BOOL)tryLock; 19 | - (BOOL)lockBeforeDate:(NSDate *)limit; 20 | 21 | @property (nullable, copy) NSString *name NS_AVAILABLE(10_5, 2_0); 22 | 23 | @end 24 | ``` 25 | 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /多线程/7.第七题.md: -------------------------------------------------------------------------------- 1 | ## 7.`NSContion` 2 | 3 | ```objc 4 | @interface NSCondition : NSObject { 5 | @private 6 | void *_priv; 7 | } 8 | 9 | - (void)wait; 10 | - (BOOL)waitUntilDate:(NSDate *)limit; 11 | - (void)signal; 12 | - (void)broadcast; 13 | 14 | @property (nullable, copy) NSString *name NS_AVAILABLE(10_5, 2_0); 15 | 16 | @end 17 | 18 | ``` 19 | 20 | `NSCondition` 的对象实际上作为一个锁和一个线程检查器,锁上之后其它线程也能上锁,而之后可以根据条件决定是否继续运行线程,即线程是否要进入 `waiting` 状态,经测试,直接进入 `waiting` 状态,当其它线程中的该锁执行 `signal` 或者 `broadcast` 方法时,线程被唤醒,继续运行之后的方法。 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /多线程/9.第九题.md: -------------------------------------------------------------------------------- 1 | ## 9.递归锁 - `NSRecursiveLock` 2 | 3 | ```objc 4 | @interface NSRecursiveLock : NSObject { 5 | @private 6 | void *_priv; 7 | } 8 | 9 | - (BOOL)tryLock; 10 | - (BOOL)lockBeforeDate:(NSDate *)limit; 11 | 12 | @property (nullable, copy) NSString *name NS_AVAILABLE(10_5, 2_0); 13 | 14 | @end 15 | NSRecursiveLock 是递归锁,他和 NSLock 的区别在于,NSRecursiveLock 可以在一个线程中重复加锁(反正单线程内任务是按顺序执行的,不会出现资源竞争问题),NSRecursiveLock 会记录上锁和解锁的次数,当二者平衡的时候,才会释放锁,其它线程才可以上锁成功。 16 | ``` 17 | 18 | -------------------------------------------------------------------------------- /开放性问题/1.第一题.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /开放性问题/10.第十题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /开放性问题/11.第十一题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /开放性问题/12.第十二题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /开放性问题/13.第十三题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /开放性问题/14.第十四题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /开放性问题/15.第十五题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /开放性问题/16.第十六题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /开放性问题/17.第十七题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /开放性问题/18.第十八题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /开放性问题/19.第十九题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /开放性问题/2.第二题.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /开放性问题/20.第二十题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /开放性问题/21.第二十一题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /开放性问题/22.第二十二题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /开放性问题/23.第二十三题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /开放性问题/3.第三题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /开放性问题/4.第四题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /开放性问题/5.第五题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /开放性问题/6.第六题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /开放性问题/7.第七题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | * 2.`分类` 不能给系统的类添加方法。 5 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 6 | 7 | -------------------------------------------------------------------------------- /开放性问题/8.第八题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /开放性问题/9.第九题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /性能优化/10.第十题.md: -------------------------------------------------------------------------------- 1 | ## 6.如何高性能的画一个圆角? 2 | 3 | 4 | > 视图和圆角的大小对帧率并没有什么卵影响,数量才是伤害的核心输出 5 | 6 | ```objc 7 | label.layer.cornerRadius = 5 8 | label.layer.masksToBounds = true 9 | ``` 10 | 首先上面的方式是不可取的,会触发离屏渲染。 11 | 12 | 13 | 14 | 15 | * 如果能够只用 `cornerRadius` 解决问题,就不用优化。 16 | 17 | * 如果必须设置 `masksToBounds`,可以参考圆角视图的数量,如果数量较少(一页只有几个)也可以考虑不用优化。 18 | 19 | * `UIImageView` 的圆角通过直接截取图片实现,其它视图的圆角可以通过 `Core Graphics` 画出圆角矩形实现。 20 | 21 | ![](http://cc.cocimg.com/api/uploads/20150803/1438567033864642.png) 22 | 23 | -------------------------------------------------------------------------------- /性能优化/11.第十一题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /性能优化/13.第十三题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /性能优化/14.第十四题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /性能优化/15.第十五题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /性能优化/16.第十六题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /性能优化/17.第十七题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /性能优化/18.第十八题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /性能优化/19.第十九题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /性能优化/2.第二题.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /性能优化/20.第二十题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /性能优化/21.第二十一题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /性能优化/22.第二十二题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /性能优化/23.第二十三题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /性能优化/3.第三题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /性能优化/4.第四题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /性能优化/5.第五题.md: -------------------------------------------------------------------------------- 1 | ## 5.如何有效降低 `APP` 包的大小? 2 | 3 | 降低包大小需要从两方面着手 4 | 5 | ##### 可执行文件 6 | 7 | * 编译器优化 8 | - Strip Linked Product、Make Strings Read-Only、Symbols Hidden by Default 设置为 YES 9 | - 去掉异常支持,Enable C++ Exceptions、Enable Objective-C Exceptions 设置为 NO, Other C Flags 添加 -fno-exceptions 10 | * 利用 AppCode 检测未使用的代码:菜单栏 -> Code -> Inspect Code 11 | 12 | * 编写LLVM插件检测出重复代码、未被调用的代码 13 | 14 | 15 | 16 | 17 | ##### 资源 18 | 19 | > 资源包括 图片、音频、视频 等 20 | 21 | * 优化的方式可以对资源进行无损的压缩 22 | * 去除没有用到的资源: https://github.com/tinymind/LSUnusedResources -------------------------------------------------------------------------------- /性能优化/6.第六题.md: -------------------------------------------------------------------------------- 1 | ## 6.日常如何检查内存泄露? 2 | 3 | 目前我知道的方式有以下几种 4 | 5 | * Memory Leaks 6 | * Alloctions 7 | * Analyse 8 | * Debug Memory Graph 9 | * MLeaksFinder 10 | 11 | ##### 泄露的内存主要有以下两种: 12 | 13 | * `Laek Memory` 这种是忘记 `Release` 操作所泄露的内存。 14 | * `Abandon Memory` 这种是循环引用,无法释放掉的内存。 15 | 16 | 17 | 上面所说的五种方式,其实前四种都比较麻烦,需要不断地调试运行,第五种是腾讯阅读团队出品,效果好一些,感兴趣的可以看一下这两篇文章: 18 | 19 | - [MLeaksFinder:精准 iOS 内存泄露检测工具](http://wereadteam.github.io/2016/02/22/MLeaksFinder/) 20 | - [MLeaksFinder 新特性](http://wereadteam.github.io/2016/07/20/MLeaksFinder2/) 21 | 22 | -------------------------------------------------------------------------------- /性能优化/7.第七题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | * 2.`分类` 不能给系统的类添加方法。 5 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 6 | 7 | -------------------------------------------------------------------------------- /性能优化/8.第八题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /扩展问题/1.第一题.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /扩展问题/10.第十题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /扩展问题/11.第十一题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /扩展问题/12.第十二题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /扩展问题/13.第十三题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /扩展问题/14.第十四题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /扩展问题/15.第十五题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /扩展问题/16.第十六题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /扩展问题/17.第十七题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /扩展问题/18.第十八题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /扩展问题/19.第十九题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /扩展问题/2.第二题.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /扩展问题/20.第二十题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /扩展问题/21.第二十一题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /扩展问题/22.第二十二题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /扩展问题/23.第二十三题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /扩展问题/3.第三题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /扩展问题/4.第四题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /扩展问题/5.第五题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /扩展问题/6.第六题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /扩展问题/7.第七题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | * 2.`分类` 不能给系统的类添加方法。 5 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 6 | 7 | -------------------------------------------------------------------------------- /扩展问题/8.第八题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /扩展问题/9.第九题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /数据存储/10.第十题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /数据存储/11.第十一题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /数据存储/12.第十二题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /数据存储/13.第十三题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /数据存储/14.第十四题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /数据存储/15.第十五题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /数据存储/16.第十六题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /数据存储/17.第十七题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /数据存储/18.第十八题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /数据存储/19.第十九题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /数据存储/20.第二十题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /数据存储/21.第二十一题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /数据存储/22.第二十二题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /数据存储/23.第二十三题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /数据存储/3.第三题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /数据存储/7.第七题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | * 2.`分类` 不能给系统的类添加方法。 5 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 6 | 7 | -------------------------------------------------------------------------------- /数据存储/8.第八题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /数据存储/9.第九题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /数据安全及加密/10.第十题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /数据安全及加密/11.第十一题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /数据安全及加密/12.第十二题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /数据安全及加密/13.第十三题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /数据安全及加密/14.第十四题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /数据安全及加密/15.第十五题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /数据安全及加密/16.第十六题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /数据安全及加密/17.第十七题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /数据安全及加密/18.第十八题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /数据安全及加密/19.第十九题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /数据安全及加密/2.第二题.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /数据安全及加密/20.第二十题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /数据安全及加密/21.第二十一题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /数据安全及加密/22.第二十二题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /数据安全及加密/23.第二十三题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /数据安全及加密/3.第三题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /数据安全及加密/4.第四题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /数据安全及加密/5.第五题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /数据安全及加密/6.第六题.md: -------------------------------------------------------------------------------- 1 | 6.简述 `SSL` 加密的过程用了哪些加密方法,为何这么作? 2 | 3 | `SSL` 加密的过程之前有些过,此处不再赘述。 4 | 5 | 6 | `SSL` 加密,在过程中实际使用了 `对称加密` 和 `非对称加密` 的结合。 7 | 8 | 主要的考虑是先使用 `非对称加密` 进行连接,这样做是为了避免中间人攻击秘钥被劫持,但是 `非对称加密` 的效率比较低。所以一旦建立了安全的连接之后,就可以使用轻量的 `对称加密`。 9 | 10 | -------------------------------------------------------------------------------- /数据安全及加密/7.第七题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | * 2.`分类` 不能给系统的类添加方法。 5 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 6 | 7 | -------------------------------------------------------------------------------- /数据安全及加密/8.第八题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /数据安全及加密/9.第九题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /数据结构/1.1-2.md: -------------------------------------------------------------------------------- 1 | ## 2.`git merge` 和 `git rebase` 的区别? 2 | 3 | 参考[这一篇文章](https://blog.csdn.net/wh_19910525/article/details/7554489)即可。 4 | 5 | 6 | -------------------------------------------------------------------------------- /数据结构/1.1-3.md: -------------------------------------------------------------------------------- 1 | ## 3.如何在本地新建一个分支,并 `push` 到远程服务器上? 2 | 3 | 1.加入我在本地新建了一个分支 4 | 5 | ```objc 6 | git checkout origin/master -b simple 7 | ``` 8 | 9 | 2.我在这个分支上新建了一些文件,要把这个分支推送到服务器上 10 | 11 | ```objc 12 | git push origin simple 13 | ``` 14 | 15 | 3.用git branch -av 查看服务器上的分支,会多出一个分支: 16 | 17 | ```objc 18 | origin/simple 19 | ``` 20 | 21 | 22 | -------------------------------------------------------------------------------- /数据结构/1.1-4.md: -------------------------------------------------------------------------------- 1 | ## 4.如果 `fork` 了一个别人的仓库,怎样与源仓库保持同步? 2 | 3 | 4 | 参考该[链接](https://blog.csdn.net/godwei_ding/article/details/78756688) 5 | 6 | 7 | ###### 1:fork源仓库 8 | ###### 2:clone到本地 9 | 10 | ```objc 11 | git clone git@github.com:username/repositoryname.git 12 | ``` 13 | 14 | 15 | ###### 3:添加源仓库路径 16 | 17 | ```objc 18 | git remote add upstream https://github.com/owername/pouch.git 19 | ``` 20 | 21 | ###### 4:源仓库路径设置 22 | 23 | ```objc 24 | git remote set-url --push upstream no-pushing 25 | ``` 26 | 27 | ###### 5:获取源仓库的最新commit 28 | 29 | ```objc 30 | git fetch upstream 31 | ``` 32 | 33 | ###### 6:将最新commit合并到本地 34 | 35 | ```objc 36 | git merge upstream/master 37 | ``` 38 | 39 | ###### 7:将本地代码pull到自己的github 40 | 41 | ```objc 42 | git pull 43 | ``` 44 | 45 | 这时三个仓库就已经保持同步了。 46 | 47 | 48 | 49 | -------------------------------------------------------------------------------- /数据结构/5.第五题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /数据结构/6.第六题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /数据结构/字典.md: -------------------------------------------------------------------------------- 1 | ## 字典 2 | 3 | 字典可以理解为键值对,类似于 `d = {key1 : value1, key2 : value2 }`。 4 | 5 | 6 | 字典中的键/值对是没有顺序的。如果你想要一个特定的顺序,那么你应该在使用前自己对它们排序。 7 | 8 | 9 | 本质也是通过 `hash` 实现的。 10 | 11 | -------------------------------------------------------------------------------- /数据结构/数组.md: -------------------------------------------------------------------------------- 1 | ## 数组 2 | 3 | 4 | ### 特点 5 | * 1. 数组是一种最简单的数据结构,它占据一块连续的内存并且顺序存储数据,所以我们需要首先指定数组的大小; 6 | * 2. 数组的空间效率不是很好,会有空闲的区域没有得到充分的应用; 7 | * 3. 时间复杂度为O(1); 8 | 9 | ### 涉及到的算法 10 | 11 | * 二维数组查找问题 12 | 13 | 14 | -------------------------------------------------------------------------------- /数据结构/链表.md: -------------------------------------------------------------------------------- 1 | ## 链表 2 | 3 | 4 | 首先可以看一下[这篇文章](https://blog.csdn.net/jianyuerensheng/article/details/51585200),其实已经总结的很到位。 5 | 6 | 7 | -------------------------------------------------------------------------------- /消息传递的方式/1.第一题.md: -------------------------------------------------------------------------------- 1 | ## 1.说一下 `NSNotification` 的实现机制? 2 | 3 | 哈希表 + 观察者模式 4 | 5 | 通知涉及到线程的知识,还有合成通知,默认是同步的等等。 6 | 7 | -------------------------------------------------------------------------------- /消息传递的方式/10.第十题.md: -------------------------------------------------------------------------------- 1 | 10`通知` 和 `代理` 有什么区别?各自适应的场景? 2 | 3 | * 通知是观察者模式,适合一对多的场景 4 | 5 | * 代理是代理模式(废话),适合一对一的反向传值 6 | 7 | * 通知耦合度低,代理的耦合度高 8 | 9 | 10 | -------------------------------------------------------------------------------- /消息传递的方式/11.第十一题.md: -------------------------------------------------------------------------------- 1 | ## 11.`__block` 的解释以及在 `ARC` 和 `MRC` 下有什么不同? 2 | 3 | 4 | 5 | 6 | 7 | `__block` 在 `MRC` 下可以解决循环引用的问题,`block` 内部的变量有了 `__block` 修饰,引用计数不会加1。 8 | 9 | 在 `ARC` 下就需要使用 `__weak` 来实现了。 10 | 11 | 12 | -------------------------------------------------------------------------------- /消息传递的方式/12.第十二题.md: -------------------------------------------------------------------------------- 1 | ## 12.`Block` 的内存管理。 2 | 3 | 4 | `Block` 的内存管理分两种情况,如果是 `MRC` 其实可以使用 `__Block`,这样 `Block` 内部截取的变量的引用计数不会 `+1`,也就无需程序员动手管理了。 5 | 6 | 7 | 在 `ARC` 下,只要不是循环引用,内存管理就不用操心了 8 | 9 | -------------------------------------------------------------------------------- /消息传递的方式/13.第十三题.md: -------------------------------------------------------------------------------- 1 | 13.`Block` 自动截取变量。 2 | 3 | `Block` 自动截取变量会截取所有权的修饰符,但是对 `全局变量` 以及 `静态全局变量` 是不会截取的。 4 | 5 | - 对于基本数据类型可以理解为值得传递。 6 | - 对于指针类型,可以理解为地址的传递。 7 | 8 | -------------------------------------------------------------------------------- /消息传递的方式/14.第十四题.md: -------------------------------------------------------------------------------- 1 | ## 14.`Block` 处理循环引用。 2 | 3 | 4 | __weak关键字,在 `MRC` 下可以使用 `__Block` 解决循环引用,但在 `ARC` 下就不起作用了 5 | 6 | -------------------------------------------------------------------------------- /消息传递的方式/15.第十五题.md: -------------------------------------------------------------------------------- 1 | ## 15.Block 有几种类型?分别是什么? 2 | 3 | 一共有三种 4 | 5 | * 1.堆 Block 6 | * 2.栈 Block 7 | * 3.全局 Block 8 | 9 | ```objc 10 | NSStackBlock 存储于栈区 11 | NSGlobalBlock 存储于程序数据区 12 | NSMallocBlock 存储于堆区 13 | ``` 14 | 15 | -------------------------------------------------------------------------------- /消息传递的方式/16.第十六题.md: -------------------------------------------------------------------------------- 1 | ## 16.`Block` 和 `函数指针` 的区别? 2 | 3 | 4 | [参考地址](https://blog.csdn.net/dexin5195/article/details/41083323) 5 | 6 | * 1. 函数指针仅仅是一个地址,不具备函数原型信息,没有类型限制,比如一个指向变量的指针同样可以指向一个函数,但是 `block` 作为函数对象,是有部分函数信息的,类型限制更明确。 7 | * 2. `block` 方式便于实现真正的 `“函数式”` 编程,让函数成为基本的运算元,往更远的方向说,真正的函数式语言可以去掉寄存器(请参考冯诺依曼机器基本架构),提高程序的执行效率,近段时间的语言都支持 `lambda` 语法,包括`JS`、 `C++` 、 `Python` 、 `Ruby`等,可见各个编程语言为改进冯诺依曼架构做出的努力和准备。 8 | * 3. 提高程序的健壮性, 定义函数的代码会位于程序的代码段,如果函数内部出现内存溢出,就会直接导致 `crash`,因为代码段是不可写的;`block` 作为函数对象在运行时生成,位于栈内,即使出现内存溢出,一般也不会直接导致 `crash`。 9 | 10 | -------------------------------------------------------------------------------- /消息传递的方式/17.第十七题.md: -------------------------------------------------------------------------------- 1 | ## 17.说一下什么是`Block`? 2 | 3 | 4 | `Block` 是将函数及其执行上下文封装起来的对象。 5 | 6 | -------------------------------------------------------------------------------- /消息传递的方式/18.第十八题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /消息传递的方式/19.第十九题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /消息传递的方式/2.第二题.md: -------------------------------------------------------------------------------- 1 | ## 2.说一下 `NSNotification` 的特点。 2 | 3 | - 1.一对多 4 | - 2.观察者模式 5 | - 3.不用的时候要移除(貌似现在不用了) 6 | 7 | -------------------------------------------------------------------------------- /消息传递的方式/20.第二十题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /消息传递的方式/21.第二十一题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /消息传递的方式/22.第二十二题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /消息传递的方式/23.第二十三题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /消息传递的方式/3.第三题.md: -------------------------------------------------------------------------------- 1 | ## 3.简述 `KVO` 的实现机制。 2 | 3 | 可以看我之前写的博客 - [KVC-KVO](https://github.com/liberalisman/KVC-KVO) 4 | 5 | 实际上是采用了 isa——swilling 的方法。 6 | 7 | - 利用 `Runtime API` 动态生成一个子类,并且让 `instance` 对象的 isa 指向这个全新的子类。 8 | - 当修改 instance 对象的属性时,会调用 Foundation 的`_NSSetXXXValueAndNotify` 函数 9 | 10 | ```objc 11 | willChangeValueForKey: 12 | 父类原来的setter 13 | didChangeValueForKey: 14 | ``` 15 | 16 | - 内部会触发监听器(Oberser)的监听方法`observeValueForKeyPath:ofObject:change:context:`。 -------------------------------------------------------------------------------- /消息传递的方式/4.第四题.md: -------------------------------------------------------------------------------- 1 | ## 4.`KVO` 在使用过程中有哪些注意点?有没有使用过其他优秀的 `KVO` 三方替代框架? 2 | 3 | ##### 注意点 4 | 5 | * 1.在继承关系中,如果父类也绑定了一些 `KVO`,子类在自己的路径中没有找到对应的路径是应该去父类找的,所以要显示调用 `super`。 6 | 7 | * 2.父类和子类有可能对同一个属性进行观察,我们知道如果对同一个属性的观察者移除两次会造成崩溃,所以我们每个类应该有唯一的 `Context` 进行区分。 8 | 9 | ###### 替代品 :FaceBook - [KVOController](https://github.com/facebook/KVOController) 10 | 11 | -------------------------------------------------------------------------------- /消息传递的方式/5.第五题.md: -------------------------------------------------------------------------------- 1 | ## 5.简述 `KVO` 的注册依赖键是什么? 2 | 3 | 可以参考我的[另一篇文章](https://github.com/liberalisman/KVC-KVO#5%E6%B3%A8%E5%86%8C%E4%BE%9D%E8%B5%96%E9%94%AE) 4 | 5 | 6 | -------------------------------------------------------------------------------- /消息传递的方式/6.第六题.md: -------------------------------------------------------------------------------- 1 | ## 6.如何做到 `KVO` 手动通知? 2 | 3 | ```objc 4 | 显式的调用 didChangeValueForKey: 5 | ``` 6 | 7 | 如果想实现手动通知,我们需要借助一个额外的方法 8 | 9 | ```objc 10 | + (BOOL)automaticallyNotifiesObserversForKey:(NSString *)key 11 | ``` 12 | 13 | 这个方法默认返回`YES`,用来标记 `Key` 指定的属性是否支持 `KVO`,如果返回值为 `NO`,则需要我们手动更新。 14 | 15 | 可以参考我的[另一篇文章](https://github.com/liberalisman/KVC-KVO) 16 | 17 | -------------------------------------------------------------------------------- /消息传递的方式/7.第七题.md: -------------------------------------------------------------------------------- 1 | ## 7.在什么情况下会触发 `KVO`? 2 | 3 | ###### 1.使用了KVC 4 | 5 | 使用了 `KVC`,如果有访问器方法,则运行时会在访问器方法中调用 `will/didChangeValueForKey:` 方法; 6 | 没用访问器方法,运行时会在 `setValue:forKey` 方法中调用 `will/didChangeValueForKey:`方法。 7 | 8 | ###### 2.有访问器方法 9 | 10 | 运行时会重写访问器方法调用 `will/didChangeValueForKey:` 方法。 11 | 因此,直接调用访问器方法改变属性值时,`KVO` 也能监听到。 12 | 13 | ###### 3.直接调用 14 | 15 | 显式调用 `will/didChangeValueForKey:` 方法。 16 | 17 | 18 | -------------------------------------------------------------------------------- /消息传递的方式/8.第八题.md: -------------------------------------------------------------------------------- 1 | ## 8.给实例变量赋值时,是否会触发 `KVO`? 2 | 3 | 4 | 不会,只要没有涉及到属性的 `Setter` 方法,就不会触发 KVO 。 5 | 6 | 可以结合第七题来讲一下,如果想触发 KVO ,可以显示的调用 `didChangeValueForKey:`。 7 | 8 | -------------------------------------------------------------------------------- /消息传递的方式/9.第九题.md: -------------------------------------------------------------------------------- 1 | ## 9.`Delegate`通常用什么关键字修饰?为什么? 2 | 3 | 通常是用 `weak` 来修饰,目的是为了避免循环引用。 4 | 5 | -------------------------------------------------------------------------------- /源代码阅读/1.第一题.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /源代码阅读/10.第十题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /源代码阅读/11.第十一题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /源代码阅读/12.第十二题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /源代码阅读/13.第十三题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /源代码阅读/14.第十四题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /源代码阅读/15.第十五题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /源代码阅读/16.第十六题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /源代码阅读/17.第十七题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /源代码阅读/18.第十八题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /源代码阅读/19.第十九题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /源代码阅读/2.第二题.md: -------------------------------------------------------------------------------- 1 | ## 2.SDWebImage 2 | 3 | 有一篇[文章](https://www.jianshu.com/p/06f0265c22eb)写的很好,推荐大家看看。 4 | 5 | -------------------------------------------------------------------------------- /源代码阅读/20.第二十题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /源代码阅读/21.第二十一题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /源代码阅读/22.第二十二题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /源代码阅读/23.第二十三题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /源代码阅读/3.第三题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /源代码阅读/4.第四题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /源代码阅读/5.第五题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /源代码阅读/6.第六题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /源代码阅读/7.第七题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | * 2.`分类` 不能给系统的类添加方法。 5 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 6 | 7 | -------------------------------------------------------------------------------- /源代码阅读/8.第八题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /源代码阅读/9.第九题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /算法集合/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liberalisman/iOS-InterviewQuestion-collection/c91a492ab4f90538373a62579f43021546f55329/算法集合/.DS_Store -------------------------------------------------------------------------------- /算法集合/1.第一题.md: -------------------------------------------------------------------------------- 1 | ## 1.字符串反转 2 | 3 | ```c 4 | void char_reverse (char *cha) { 5 | 6 | // 定义头部指针 7 | char *begin = cha; 8 | // 定义尾部指针 9 | char *end = cha + strlen(cha) -1; 10 | 11 | 12 | while (begin < end) { 13 | 14 | char temp = *begin; 15 | *(begin++) = *end; 16 | *(end--) = temp; 17 | } 18 | } 19 | ``` 20 | 21 | 22 | ###### 使用示例 23 | 24 | ```c 25 | char ch[] = "Hello World"; 26 | 27 | char_reverse (ch); 28 | 29 | // 有兴趣的可以验证 30 | printf ("%s",ch); 31 | 32 | ``` 33 | 34 | 35 | -------------------------------------------------------------------------------- /算法集合/10.第十题.md: -------------------------------------------------------------------------------- 1 | ## 10.在一个数组中找出前四个最大的数字。 2 | 3 | 4 | 其实思路很简单,排好序,直接取最后四个即可 5 | 6 | 7 | -------------------------------------------------------------------------------- /算法集合/8.第八题.md: -------------------------------------------------------------------------------- 1 | 8.求出数组中连续数字的和值 2 | 3 | 举例 4 | 5 | ```objc 6 | // 伪代码 7 | [2,3,3,3,3,9,9,1,2,6,6,6,6,6,7] 8 | 9 | 上面这个数组相同连续数字的和为 6+6+6+6+6 = 30 10 | 11 | ``` 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /算法集合/9.第九题.md: -------------------------------------------------------------------------------- 1 | 9.白鼠与毒酒的算法问题。 2 | 3 | 4 | [原文链接](http://www.iteye.com/problems/40956) 5 | 6 | 设有 `N` 桶酒,有一桶是毒酒,编号从`0` 到 `N-1`,最少要 `K` 只白鼠,显然: 7 | 8 | ```objc 9 | 当N=2,K=1 10 | 当N=3,K=2 11 | 当N=4,K=2 12 | 4桶酒编号0,1,2,3 13 | K=2,设有白鼠A和白鼠B 14 | A喝0,1,B喝0,2 15 | 一星期后,有4种可能状态 16 | A死B死(0号有毒),A死B活(1号有毒),A活B死(2号有毒),A活B活(3号有毒) 17 | ``` 18 | 19 | 猜想白鼠的最终状态只有死活两种可能,通过白鼠一星期后的状态可以算出毒酒编号 20 | 21 | 22 | 很自然想到二进制,例如: 23 | 24 | ```objc 25 | 当N=4时,0=00,1=01,2=10,3=11 26 | 当N=8,K=3 27 | 0=000,1=001,2=010,3=011,4=100,5=101,6=110,7=111 28 | 白鼠A,B,C 29 | A喝0,1,2,3 (0XX) 30 | B喝0,1,4,5 (X0X) 31 | C喝0,2,4,6 (XX0) 32 | ABC的最终状态可以确定毒酒编号 33 | 当N=1000时,可以类推至少要10只,你可以这样推出这10只白鼠具体是喝哪些编号的酒,规律很明显了 34 | ``` 35 | 36 | 回过来再想想,1000之内的任意一个数都可以用一个10位的二进制数表示(不够的话前面补0),白鼠与数位对应,第几位为0,则说明第几位的白鼠死了,而这个二进制的编号即为毒酒编号 37 | 38 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /算法集合/二维数组查找.md: -------------------------------------------------------------------------------- 1 | #### 二维数组查找 2 | 3 | -------------------------------------------------------------------------------- /算法集合/冒泡排序.md: -------------------------------------------------------------------------------- 1 | #### 冒泡排序 2 | 3 | ```objc 4 | int a[10] = {3,2,1,4,5,0,6,7,8,9}; 5 | 6 | int temp = 0; 7 | 8 | for (int i = 0; i < 10 -1; i++) { 9 | 10 | for (int j = 0; j < 10 - i - 1; j++) { 11 | 12 | if (a[j] > a[j+1]) { 13 | 14 | temp = a[j+1]; 15 | a[j+1] = a[j]; 16 | a[j] = temp; 17 | } 18 | } 19 | } 20 | 21 | for (int i = 0; i < 10; i++) 22 | { 23 | printf("%i",a[i]); 24 | } 25 | ``` 26 | 27 | -------------------------------------------------------------------------------- /算法集合/排序算法.md: -------------------------------------------------------------------------------- 1 | #### 排序算法 2 | 3 | 1.冒泡排序 4 | 5 | 2.选择排序 6 | 7 | 3.快速排序 8 | 9 | -------------------------------------------------------------------------------- /算法集合/选择排序.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liberalisman/iOS-InterviewQuestion-collection/c91a492ab4f90538373a62579f43021546f55329/算法集合/选择排序.md -------------------------------------------------------------------------------- /网络/1.第一题.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /网络/10.第十题.md: -------------------------------------------------------------------------------- 1 | 2 | ## 10.说一下 `TCP/IP` 五层模型的协议? 3 | 4 | 5 | 6 | #### 应用层 7 | #### 传输层 8 | #### 网路层 9 | #### 数据链路层 10 | #### 物理层 11 | 12 | 13 | ![](https://images2015.cnblogs.com/blog/705728/201604/705728-20160424234825491-384470376.png) 14 | 15 | ![](https://images2015.cnblogs.com/blog/705728/201604/705728-20160424234827195-1493107425.png) 16 | 17 | -------------------------------------------------------------------------------- /网络/11.第十一题.md: -------------------------------------------------------------------------------- 1 | ## 11.说一下 `OSI` 七层模型的协议? 2 | - 应用层 文件传输,电子邮件,文件服务,虚拟终端 TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet 3 | - 表示层 数据格式化,代码转换,数据加密 没有协议 4 | - 会话层 解除或建立与别的接点的联系 没有协议 5 | - 传输层 提供端对端的接口 TCP,UDP 6 | - 网络层 为数据包选择路由 IP,ICMP,RIP,OSPF,BGP,IGMP 7 | - 数据链路层 传输有地址的帧以及错误检测功能 SLIP,CSLIP,PPP,ARP,RARP,MTU 8 | - 物理层 以二进制数据形式在物理媒体上传输数据 ISO2110,IEEE802,IEEE802.2 9 | 10 | 11 | ![](https://images2015.cnblogs.com/blog/705728/201604/705728-20160424234825491-384470376.png) 12 | 13 | 14 | ![](https://images2015.cnblogs.com/blog/705728/201604/705728-20160424234827195-1493107425.png) 15 | 16 | -------------------------------------------------------------------------------- /网络/12.第十二题.md: -------------------------------------------------------------------------------- 1 | ## 12.`大文件下载` 的功能有什么注意点? 2 | 3 | 注意要边下载数据边写入文件,不然会造成占用内存空间过大 4 | 5 | 6 | -------------------------------------------------------------------------------- /网络/13.第十三题.md: -------------------------------------------------------------------------------- 1 | 13.`断点续传` 功能该怎么实现? 2 | 3 | 4 | * 1.利用 `http` 的头部字段 ,设置 `http` 的 `Range` 属性 5 | * 2.检测下载进度,并且判断是否需要重新创建下载文件 6 | 7 | -------------------------------------------------------------------------------- /网络/14.第十四题.md: -------------------------------------------------------------------------------- 1 | ## 14.封装一个网络框架有哪些注意点? 2 | 3 | 4 | 有时间可以看看这篇文章,思路很好 https://juejin.im/post/5b3a303be51d4555c07a7ae1 5 | 6 | -------------------------------------------------------------------------------- /网络/15.第十五题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /网络/16.第十六题.md: -------------------------------------------------------------------------------- 1 | ## 16.`NSUrlProtocol`用过吗?用在什么地方了? 2 | 3 | 4 | 可以拦截全局的网络请求。 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /网络/17.第十七题.md: -------------------------------------------------------------------------------- 1 | ## 17.如何在测试过程中 `MOCK` 各种网络环境? 2 | 3 | https://blog.csdn.net/u010828718/article/details/46986795 4 | 5 | -------------------------------------------------------------------------------- /网络/18.第十八题.md: -------------------------------------------------------------------------------- 1 | ## 18.`DNS` 的解析过程?网络的 `DNS` 优化。 2 | 3 | 4 | > `DNS` 是域名到 `IP` 地址的映射,`DNS` 解析使用 `UDP` 数据报,端口号53,并且采用明文传输的方式 5 | 6 | 客户端在向服务端发送请求时,会先将 `域名` 到 `DNS` 服务器映射出 `IP` 地址,然后再访问。 7 | 8 | #### `DNS` 解析的两种方式 9 | 10 | ###### 递归查询 11 | 不断地自下而上遍历解析,“我去给你问一下”的方式 12 | 13 | ###### 迭代查询 14 | 迭代查询 是 “我告诉你谁可能知道”的方式 15 | 16 | 17 | 18 | #### `DNS` 解析存在的问题 19 | 20 | ###### `DNS` 劫持 21 | 22 | 被钓鱼网站劫持,有可能返回错误的 `IP`,浏览的不是目标浏览器 23 | 24 | ###### `DNS` 解析转发 25 | 晓得运营商可能将 `DNS` 解析请求转发,解析的比较慢,效率低 26 | 27 | 28 | #### `DNS` 劫持解决办法 29 | 30 | ###### httpDNS 31 | 使用 `http` 协议向 `DNS` 服务器 80 端口进行请求 32 | 33 | ###### 长连接 34 | 35 | 找一个中间的长连 `server` ,在内网专线进行 `Http` 请求。客户端和这个长连 `server`通信即可。 36 | 37 | 38 | -------------------------------------------------------------------------------- /网络/2.第二题.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /网络/20.第二十题.md: -------------------------------------------------------------------------------- 1 | # 20.网络请求的状态码都大致代表什么意思? 2 | 3 | ##### 1.1xx 4 | 5 | > 1xx 代表临时响应,需要请求者继续执行操作的状态代码。 6 | 7 | ##### 2.2xx 8 | 9 | > 2xx 代表的多是操作成功。 10 | 11 | ##### 3.3xx 12 | 13 | > 3xx 代表重定向,表示要完成请求,需要进一步操作 14 | 15 | ##### 4.4xx 16 | 17 | > 4xx 代表请求错误,表示请求可能出错,妨碍了服务器的处理。 18 | 19 | ##### 5.5xx 20 | 21 | > 5xx 代表服务器错误,表示服务器在尝试处理请求时发生内部错误。 这些错误可能是服务器本身的错误,而不是请求出错 22 | 23 | -------------------------------------------------------------------------------- /网络/21.第二十一题.md: -------------------------------------------------------------------------------- 1 | ## 21.抓包软件 `Charles` 的原理是什么?说一下中间人攻击的过程。 2 | 3 | 4 | `Charles` 的原理实际就是网络的 `中间人攻击`。 5 | 6 | 中间人(MITM)攻击是一种攻击类型,其中攻击者将它自己放到两方之间,通常是客户端和服务端通信线路的中间。这可以通过破坏原始频道之后拦截一方的消息并将它们转发(有时会有改变)给另一方来实现。 7 | 8 | 9 | * 客户端发给服务端的请求,被中间人劫持篡改之后,再发送给服务端。 10 | 11 | * 服务端返回给客户端的数据,被中间人劫持篡改之后,再返回给客户端。 12 | 13 | -------------------------------------------------------------------------------- /网络/22.第二十二题.md: -------------------------------------------------------------------------------- 1 | ## 22.如何判断一个请求是否结束? 2 | 3 | 4 | - 1.查看 `Content-Length` 是否达到 1024 字节。 5 | - 2.通过 `Post` 发送请求时,消息一般都是一段一段返回的,看最后的一个 `chunked` 是否为空? 6 | 7 | 8 | -------------------------------------------------------------------------------- /网络/23.第二十三题.md: -------------------------------------------------------------------------------- 1 | ## 23. SSL 传输协议?说一下 SSL 验证过程? 2 | 3 | * 1.配备了 `身份证书`,防止被冒充。 4 | * 2.有 `校验机制`,一旦被篡改,双方都会知道。 5 | * 3.通过 `加密` 进行传播。 6 | 7 | #### 连接过程如下: 8 | * ①:客户端向服务端发消息,包括客户端支持的 `加密算法` 以及 `随机数1` 、`TLS` 版本号。 9 | * ②:服务端向客户端返回信息,包括双方已经匹配好的 `加密算法` 以及 `随机数2`、`Server证书` 。 10 | * ③:服务端向客户端返回 `验证证书`。 11 | * ④:客户端进行证书验证,首先要评估信任证书 12 | - 1.服务端向客户端返回证书的 `数字摘要` 与服务端证书返回客户端,解密后的是否一致,防止被篡改。 13 | - 2.验证证书链:逐级验证服务端证书是否在可信任证书列表。 14 | - 3.验证通过后: 15 | - ①:将 `随机数1`、`随机数2`、服务器端返回 `证书公钥` 加密过后的 `预主秘钥` 三者组合成 `会话密钥`。 16 | - ②:服务端拿到 `会话秘钥` 后,会用服务端证书 `私钥`进行解密,得到 `预主秘钥`。 17 | - ③:服务端将 `随机数1`、`随机数2`、服务器端证书私钥解密得到的 `预主秘钥` 三者组合成 `会话密钥`。此时客户端的 `会话秘钥` 和 服务端的 `会话秘钥` 应该是一致的。 18 | - ④:接下来会经行验证: 19 | - 1.客户端通过 `会话秘钥`,加密信息发给服务端,看服务端能否成功接收。 20 | - 2.服务端通过 `会话秘钥`,加密信息返给客户端,看客户端能否成功解析。 21 | - 4.以上步骤都通过了,此时 `SSL` 验证连接。 22 | 23 | -------------------------------------------------------------------------------- /网络/24.第二十四题.md: -------------------------------------------------------------------------------- 1 | ## 24.解释一下 `Http` 的持久连接? 2 | 3 | 4 | > 每次建立连接的时候都要经过三次握手等必须的程序,如果我们拥有一条可以一直使用的连接的话,也就意味着我们只需要进行一次连接的建立,这就省去了每次建立连接的时间。 5 | 6 | >使用过的连接会比新建立的连接速度会快一些,这是由于TCP连接慢启动的特性,每次建立新的连接,当然不如已经被调教的很好的连接速度快。 7 | 8 | >每个连接对于服务器和客户端来说都是负担,能少开尽量少开,当然是在不影响功能和体验的前 9 | 10 | 11 | 12 | ###### keep-alive 13 | **connection:keep-alive**,在头部字段添加该字段,如果服务器返回的也是这个字段,就可以保持持续连接。 14 | 15 | ###### timeout 16 | **timeout:20** 表示持续时间 17 | 18 | ###### max 19 | **max:30** 表示最多建立多少个 `Http` 连接 20 | 21 | 22 | -------------------------------------------------------------------------------- /网络/25.第二十五题.md: -------------------------------------------------------------------------------- 1 | ## 25.说一下传输控制协议 - `TCP` ? 2 | 3 | #### 1.面向连接 4 | 数据传输开始之前,需要建立连接,例如 `三次握手` 和 `四次挥手`。 5 | 6 | #### 2.可靠传输 7 | 8 | - 无差错 9 | - 不丢失 10 | - 不重复 11 | - 按序到达(滑动窗口协议实现的) 12 | 13 | 停止等待协议 14 | - 无差错情况 15 | - 超时重传 16 | - 确认丢失 17 | - 确认迟到 18 | 19 | #### 3.面向字节流 20 | 可以对照 `UDP` 的面向报文,字节由 `TCP` 控制 21 | 22 | ![](http://okhqmtd8q.bkt.clouddn.com/TCP%E9%9D%A2%E5%90%91%E5%AD%97%E8%8A%82%E6%B5%81.png) 23 | 24 | #### 4.流量控制 25 | 26 | 滑动窗口协议 27 | 28 | ![](http://okhqmtd8q.bkt.clouddn.com/TCP%E6%BB%91%E5%8A%A8%E7%AA%97%E5%8F%A3%E5%8D%8F%E8%AE%AE.png) 29 | 30 | #### 5.拥塞控制 31 | 32 | - 慢开始,拥塞避免 33 | - 快恢复、快重传 34 | 35 | ![](http://okhqmtd8q.bkt.clouddn.com/TCP%E6%8B%A5%E5%A1%9E%E6%8E%A7%E5%88%B6.png) 36 | 37 | -------------------------------------------------------------------------------- /网络/26.第二十六题.md: -------------------------------------------------------------------------------- 1 | ## 26.说一下用户数据报协议 - `UDP` ? 2 | 3 | ### 特点 4 | 5 | ###### 1.无连接 6 | 不需要事先建立连接,也不需要释放 7 | 8 | ###### 2.尽最大努力交付 9 | 不保证可靠传输 10 | 11 | ###### 3.面向报文 12 | 既不合并,也不拆分 13 | 14 | ![](http://okhqmtd8q.bkt.clouddn.com/UDP%E9%9D%A2%E5%90%91%E6%8A%A5%E6%96%87.png) 15 | 16 | ### 功能 17 | 18 | ###### 1.复用、分用 19 | 20 | 多端口复用-不管从哪个端口发送出去,都可以复用传输层的数据报 21 | 22 | 根据目标端口可以进行数据分发 23 | 24 | ![](http://okhqmtd8q.bkt.clouddn.com/UDP%E5%A4%8D%E7%94%A8%E5%92%8C%E5%88%86%E7%94%A8.png) 25 | 26 | ###### 2.差错检测 27 | 28 | 即时通讯项目要保证消息的准确性 29 | 30 | ![](http://okhqmtd8q.bkt.clouddn.com/UDP%E5%B7%AE%E9%94%99%E6%A3%80%E6%B5%8B.png) 31 | 32 | -------------------------------------------------------------------------------- /网络/27.第二十七题.md: -------------------------------------------------------------------------------- 1 | ## 27.谈一谈网络中的 `session` 和 `cookie`? 2 | 3 | 因为 `Http` 无状态的特性,如果需要判断是哪个用户,这时就需要 `Cookie` 和 `Session`。 4 | 5 | `Cookie` 存储在客户端,用来记录用户状态,区分用户。一般都是服务端把生成的 `Cookie` 通过响应返回给客户端,客户端保存。 6 | 7 | `Session` 存储在网络端,需要依赖 `Cookie` 机制。服务端生成了 `Session` 后,返回给客户端,客户端 `setCookie:sessionID`,所以下次请求的时候,客户端把 `Cookie` 发送给服务端,服务端解析出 `SessionID`,在服务端根据 `SessionID` 判断当前的用户。 8 | 9 | #### 如何修改 `Cookie`? 10 | 11 | * 相同 `Key` 值得新的 `Cookie` 会覆盖旧的 `Cookie`. 12 | 13 | * 覆盖规则是 name path 和 domain 等需要与原有的一致 14 | 15 | #### 如何删除 `Cookie`? 16 | 17 | * 相同 `Key` 值得新的 `Cookie` 会覆盖旧的 `Cookie`. 18 | 19 | * 覆盖规则是 name path 和 domain 等需要与原有的一致 20 | 21 | * 设置 `Cookie` 的 `expires` 为过去的一个时间点,或者 `maxAge = 0` 22 | 23 | #### 如何保证 `Cookie` 的安全? 24 | 25 | - 对 `Cookie` 进行加密处理 26 | - 只在 `Https` 上携带 `Cookie`。 27 | - 设置 `Cookie` 为 `httpOnly`,防止跨站脚本攻击。 28 | 29 | 30 | -------------------------------------------------------------------------------- /网络/28.第二十八题.md: -------------------------------------------------------------------------------- 1 | ## 24.解释一下 `Http` 的持久连接? 2 | 3 | 4 | > 每次建立连接的时候都要经过三次握手等必须的程序,如果我们拥有一条可以一直使用的连接的话,也就意味着我们只需要进行一次连接的建立,这就省去了每次建立连接的时间。 5 | 6 | >使用过的连接会比新建立的连接速度会快一些,这是由于TCP连接慢启动的特性,每次建立新的连接,当然不如已经被调教的很好的连接速度快。 7 | 8 | >每个连接对于服务器和客户端来说都是负担,能少开尽量少开,当然是在不影响功能和体验的前 9 | 10 | 11 | 12 | ###### keep-alive 13 | **connection:keep-alive**,在头部字段添加该字段,如果服务器返回的也是这个字段,就可以保持持续连接。 14 | 15 | ###### timeout 16 | **timeout:20** 表示持续时间 17 | 18 | ###### max 19 | **max:30** 表示最多建立多少个 `Http` 连接 20 | 21 | 22 | -------------------------------------------------------------------------------- /网络/29.第二十九题.md: -------------------------------------------------------------------------------- 1 | ## 24.解释一下 `Http` 的持久连接? 2 | 3 | 4 | > 每次建立连接的时候都要经过三次握手等必须的程序,如果我们拥有一条可以一直使用的连接的话,也就意味着我们只需要进行一次连接的建立,这就省去了每次建立连接的时间。 5 | 6 | >使用过的连接会比新建立的连接速度会快一些,这是由于TCP连接慢启动的特性,每次建立新的连接,当然不如已经被调教的很好的连接速度快。 7 | 8 | >每个连接对于服务器和客户端来说都是负担,能少开尽量少开,当然是在不影响功能和体验的前 9 | 10 | 11 | 12 | ###### keep-alive 13 | **connection:keep-alive**,在头部字段添加该字段,如果服务器返回的也是这个字段,就可以保持持续连接。 14 | 15 | ###### timeout 16 | **timeout:20** 表示持续时间 17 | 18 | ###### max 19 | **max:30** 表示最多建立多少个 `Http` 连接 20 | 21 | 22 | -------------------------------------------------------------------------------- /网络/3.第三题.md: -------------------------------------------------------------------------------- 1 | ## 3.`Http` 和 `Https` 的区别?为什么更加安全? 2 | 3 | 4 | ##### 区别 5 | 6 | * 1.`HTTPS` 需要向机构申请 `CA` 证书,极少免费。 7 | * 2.`HTTP` 属于明文传输,`HTTPS`基于 `SSL` 进行加密传输。 8 | * 3.`HTTP` 端口号为 `80`,`HTTPS` 端口号为 `443` 。 9 | * 4.`HTTPS` 是加密传输,有身份验证的环节,更加安全。 10 | 11 | 12 | ##### 安全 13 | **SSL(安全套接层)** 14 | **TLS(传输层安全)** 15 | 16 | 17 | 以上两者在传输层之上,对网络连接进行加密处理,保障数据的完整性,更加的安全。 18 | 19 | 20 | -------------------------------------------------------------------------------- /网络/30.第三十题.md: -------------------------------------------------------------------------------- 1 | ## 24.解释一下 `Http` 的持久连接? 2 | 3 | 4 | > 每次建立连接的时候都要经过三次握手等必须的程序,如果我们拥有一条可以一直使用的连接的话,也就意味着我们只需要进行一次连接的建立,这就省去了每次建立连接的时间。 5 | 6 | >使用过的连接会比新建立的连接速度会快一些,这是由于TCP连接慢启动的特性,每次建立新的连接,当然不如已经被调教的很好的连接速度快。 7 | 8 | >每个连接对于服务器和客户端来说都是负担,能少开尽量少开,当然是在不影响功能和体验的前 9 | 10 | 11 | 12 | ###### keep-alive 13 | **connection:keep-alive**,在头部字段添加该字段,如果服务器返回的也是这个字段,就可以保持持续连接。 14 | 15 | ###### timeout 16 | **timeout:20** 表示持续时间 17 | 18 | ###### max 19 | **max:30** 表示最多建立多少个 `Http` 连接 20 | 21 | 22 | -------------------------------------------------------------------------------- /网络/31.第三十一题.md: -------------------------------------------------------------------------------- 1 | ## 24.解释一下 `Http` 的持久连接? 2 | 3 | 4 | > 每次建立连接的时候都要经过三次握手等必须的程序,如果我们拥有一条可以一直使用的连接的话,也就意味着我们只需要进行一次连接的建立,这就省去了每次建立连接的时间。 5 | 6 | >使用过的连接会比新建立的连接速度会快一些,这是由于TCP连接慢启动的特性,每次建立新的连接,当然不如已经被调教的很好的连接速度快。 7 | 8 | >每个连接对于服务器和客户端来说都是负担,能少开尽量少开,当然是在不影响功能和体验的前 9 | 10 | 11 | 12 | ###### keep-alive 13 | **connection:keep-alive**,在头部字段添加该字段,如果服务器返回的也是这个字段,就可以保持持续连接。 14 | 15 | ###### timeout 16 | **timeout:20** 表示持续时间 17 | 18 | ###### max 19 | **max:30** 表示最多建立多少个 `Http` 连接 20 | 21 | 22 | -------------------------------------------------------------------------------- /网络/4.第四题.md: -------------------------------------------------------------------------------- 1 | ## 4.4.`Http`的请求方式有哪些?`Http` 有什么特性? 2 | 3 | **`Http`的请求方式有一下 8 种:** 4 | 5 | * 1.GET 6 | * 2.POST 7 | * 3.HEAD 8 | * 4.PUT 9 | * 5.DELETE 10 | * 6.OPTIONS 11 | * 7.TRACE 12 | * 8.CONNECT 13 | 14 | **`Http` 的特点有:** 15 | 16 | * 1.无连接:可以理解为持久链接。 17 | * 2.无状态:利用 `session` && `cookie` 区分用户。 18 | 19 | 20 | -------------------------------------------------------------------------------- /网络/6.第六题.md: -------------------------------------------------------------------------------- 1 | ## 6.`GET` 和 `POST` 请求的区别? 2 | 3 | ##### 1.参数位置 4 | - 1.`GET` 方式的请求参数以 `?` 拼接到 `Url` 后面。 5 | - 2.`Post` 请求的参数在请求体内。 6 | 7 | ##### 2.参数长度 8 | 9 | - 1.`GET` 方式的请求参数长度限制为 2048字符。 10 | - 2.`Post` 请求的参数长度没有该限制。 11 | 12 | ##### 3.安全性 13 | 14 | - 1.`GET` 方式不会引起服务端的任何变化 15 | 16 | ##### 4.幂等性(同一方法执行多次和执行一次效果相同) 17 | - 1.`GET` 幂等。 18 | - 2.`POST` 不幂等。 19 | 20 | ##### 5.缓存性 21 | - 1.`GET` 可缓存。 22 | - 2.`Post` 不可缓存。 23 | 24 | 25 | -------------------------------------------------------------------------------- /网络/7.第七题.md: -------------------------------------------------------------------------------- 1 | ## 7.`HTTP` 请求报文 和 响应报文的结构? 2 | ##### 1.请求报文的结构。 3 | - ①:请求行 (请求方式、URL) 4 | - ②:首部行(键值对形式,`CRLF` 代表换行结束) 5 | - ③:实体主体(post请求中,存放请求参数) 6 | 7 | ##### 1.响应报文的结构。 8 | - ①:响应行 (版本、状态码) 9 | - ②:首部行 (键值对形式,`CRLF` 代表换行结束) 10 | - ③:实体主体(响应返回的数据) 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /网络/8.第八题.md: -------------------------------------------------------------------------------- 1 | ## 8.什么是 `Mimetype` ? 2 | 在浏览器中显示的内容有 `HTML`、有 `XML`、有 `GIF`、还有 `Flash` ……那么,浏览器是如何区分它们,决定什么内容用什么形式来显示呢?答案是 `MIME Type`,也就是该资源的媒体类型。 3 | 4 | 5 | 6 | ```objc 7 | //向该文件发送请求,根据请求头拿到该文件的MIMEType 8 | -(NSString *)getMIMETypeURLRequestAtPath:(NSString*)path 9 | { 10 | //1.确定请求路径 11 | NSURL *url = [NSURL fileURLWithPath:path]; 12 | 13 | //2.创建可变的请求对象 14 | NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; 15 | 16 | //3.发送请求 17 | NSHTTPURLResponse *response = nil; 18 | [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:nil]; 19 | 20 | NSString *mimeType = response.MIMEType; 21 | return mimeType; 22 | } 23 | 24 | ``` 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /网络/9.第九题.md: -------------------------------------------------------------------------------- 1 | ## 9.数据传输的加密过程? 2 | 3 | **SSL(安全套接层)** 4 | **TLA(传输层安全)** 5 | 6 | > 以上两者在传输层之上,对网络连接进行加密处理,保障数据的完整性,更加的安全。 7 | 8 | 9 | - 1.客户端:发送数据 -> HTTP(应用层) -> SSL&TLS(加密处理) -> TCP(传输层) -> IP(网络层) 10 | 11 | - 2.服务端: IP(网络层) -> TCP(传输层) -> SSL&TLS(解密处理) -> HTTP(应用层) -> 接受数据 12 | 13 | -------------------------------------------------------------------------------- /蓝牙/1.第一题.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /蓝牙/10.第十题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /蓝牙/11.第十一题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /蓝牙/12.第十二题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /蓝牙/13.第十三题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /蓝牙/14.第十四题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /蓝牙/15.第十五题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /蓝牙/16.第十六题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /蓝牙/17.第十七题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /蓝牙/18.第十八题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /蓝牙/19.第十九题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /蓝牙/2.第二题.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /蓝牙/20.第二十题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /蓝牙/21.第二十一题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /蓝牙/22.第二十二题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /蓝牙/23.第二十三题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /蓝牙/3.第三题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /蓝牙/4.第四题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /蓝牙/5.第五题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /蓝牙/6.第六题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /蓝牙/7.第七题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | * 2.`分类` 不能给系统的类添加方法。 5 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 6 | 7 | -------------------------------------------------------------------------------- /蓝牙/8.第八题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /蓝牙/9.第九题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /视频处理/1.第一题.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /视频处理/10.第十题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /视频处理/11.第十一题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /视频处理/12.第十二题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /视频处理/13.第十三题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /视频处理/14.第十四题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /视频处理/15.第十五题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /视频处理/16.第十六题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /视频处理/17.第十七题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /视频处理/18.第十八题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /视频处理/19.第十九题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /视频处理/2.第二题.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /视频处理/20.第二十题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /视频处理/21.第二十一题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /视频处理/22.第二十二题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /视频处理/23.第二十三题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /视频处理/3.第三题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /视频处理/4.第四题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /视频处理/5.第五题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /视频处理/6.第六题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /视频处理/7.第七题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | * 2.`分类` 不能给系统的类添加方法。 5 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 6 | 7 | -------------------------------------------------------------------------------- /视频处理/8.第八题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /视频处理/9.第九题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /计算题/1.第一题.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /计算题/10.第十题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /计算题/11.第十一题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /计算题/12.第十二题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /计算题/13.第十三题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /计算题/14.第十四题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /计算题/15.第十五题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /计算题/16.第十六题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /计算题/17.第十七题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /计算题/18.第十八题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /计算题/19.第十九题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /计算题/2.第二题.md: -------------------------------------------------------------------------------- 1 | ## 2.不使用第三个变量,交换两个变量的值。 2 | 3 | 4 | ```objc 5 | int a = 5; 6 | int b = 10; 7 | 8 | a = a + b; //a=15,b=10; 9 | b = a - b; //a=15,b=5; 10 | a = a - b; //a=10,b=5; 11 | 12 | ``` 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /计算题/20.第二十题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /计算题/21.第二十一题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /计算题/22.第二十二题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /计算题/23.第二十三题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /计算题/3.第三题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /计算题/4.第四题.md: -------------------------------------------------------------------------------- 1 | ## 4.编码求,给定一个整数,按照十进制的编码计算包含多少个 `0`? 2 | 3 | 这道题可以利用数字的计算能力,用这个数字不断对 `10` 进行取余运算,就可以判断出有多少个 `0`。 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /计算题/5.第五题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /计算题/6.第六题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /计算题/7.第七题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | * 2.`分类` 不能给系统的类添加方法。 5 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 6 | 7 | -------------------------------------------------------------------------------- /计算题/8.第八题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /计算题/9.第九题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /设计模式/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liberalisman/iOS-InterviewQuestion-collection/c91a492ab4f90538373a62579f43021546f55329/设计模式/.DS_Store -------------------------------------------------------------------------------- /设计模式/1.第一题.md: -------------------------------------------------------------------------------- 1 | ## 1.编程中的六大设计原则? 2 | 3 | ##### 1.单一职责原则 4 | 通俗地讲就是一个类只做一件事 5 | 6 | * `CALayer`:动画和视图的显示。 7 | * `UIView`:只负责事件传递、事件响应。 8 | 9 | ##### 2.开闭原则 10 | 11 | 对修改关闭,对扩展开放。 12 | 要考虑到后续的扩展性,而不是在原有的基础上来回修改 13 | 14 | ##### 3.接口隔离原则 15 | 16 | 使用多个专门的协议、而不是一个庞大臃肿的协议 17 | 18 | * `UITableviewDelegate` 19 | * `UITableViewDataSource` 20 | 21 | ##### 4.依赖倒置原则 22 | 23 | 抽象不应该依赖于具体实现、具体实现可以依赖于抽象。 24 | 调用接口感觉不到内部是如何操作的 25 | 26 | ##### 5.里氏替换原则 27 | 28 | 父类可以被子类无缝替换,且原有的功能不受任何影响 29 | 30 | 例如 KVO 31 | 32 | 33 | ##### 6.迪米特法则 34 | 35 | 一个对象应当对其他对象尽可能少的了解,实现高聚合、低耦合 36 | 37 | 38 | 39 | # 推荐文章 40 | [面向对象设计的六大设计原则(附 Demo 及 UML 类图)- J_Knight_](https://juejin.im/post/5b9526c1e51d450e69731dc2) -------------------------------------------------------------------------------- /设计模式/3.第三题.md: -------------------------------------------------------------------------------- 1 | ## 3.如何设计一个时长统计框架? 2 | 3 | 4 | ### 记录器 5 | 6 | - 页面式记录器 7 | - 流式记录器 8 | - 自定义式 9 | 10 | 11 | ### 记录管理者 12 | 13 | - 内存记录缓存 14 | - 磁盘存储 15 | - 上传器 16 | 17 | 18 | 19 | ### 如何降低数据的丢失率? 20 | - 定期写入磁盘 21 | - 每当达到某个值的时候,就写入磁盘 22 | 23 | 24 | ### 记录上传的时机 25 | 26 | - 前后台切换的时候可以上传 27 | - 从无网到有网切换的时候可以上传 28 | 29 | ### 上传时机的选择 30 | - 立即上传 31 | - 定时上传 32 | - 延时上传 33 | 34 | 35 | -------------------------------------------------------------------------------- /设计模式/4.第四题.md: -------------------------------------------------------------------------------- 1 | ## 4.如何实现 `App` 换肤(夜间模式)? 2 | 3 | 4 | 扩利用 [DKNightVersion](https://github.com/Draveness/DKNightVersion) 完成。 5 | 6 | 7 | 同时可以参考一下[这篇文章](https://juejin.im/post/5af93d276fb9a07acf5644d3)。 8 | 9 | 10 | -------------------------------------------------------------------------------- /设计模式/DesignPatten/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liberalisman/iOS-InterviewQuestion-collection/c91a492ab4f90538373a62579f43021546f55329/设计模式/DesignPatten/.DS_Store -------------------------------------------------------------------------------- /设计模式/DesignPatten/Adapter/CoolTarget.h: -------------------------------------------------------------------------------- 1 | // 2 | // CoolTarget.h 3 | // DesignPatten 4 | // 5 | // Created by yangyang38 on 2018/3/17. 6 | // Copyright © 2018年 yangyang. All rights reserved. 7 | // 8 | 9 | #import "Target.h" 10 | 11 | // 适配对象 12 | @interface CoolTarget : NSObject 13 | 14 | // 被适配对象 15 | @property (nonatomic, strong) Target *target; 16 | 17 | // 对原有方法包装 18 | - (void)request; 19 | 20 | @end 21 | -------------------------------------------------------------------------------- /设计模式/DesignPatten/Adapter/CoolTarget.m: -------------------------------------------------------------------------------- 1 | // 2 | // CoolTarget.m 3 | // DesignPatten 4 | // 5 | // Created by yangyang38 on 2018/3/17. 6 | // Copyright © 2018年 yangyang. All rights reserved. 7 | // 8 | 9 | #import "CoolTarget.h" 10 | 11 | @implementation CoolTarget 12 | 13 | - (void)request 14 | { 15 | // 额外处理 16 | 17 | [self.target operation]; 18 | 19 | // 额外处理 20 | } 21 | 22 | @end 23 | -------------------------------------------------------------------------------- /设计模式/DesignPatten/Adapter/Target.h: -------------------------------------------------------------------------------- 1 | // 2 | // Target.h 3 | // DesignPatten 4 | // 5 | // Created by yangyang38 on 2018/3/17. 6 | // Copyright © 2018年 yangyang. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface Target : NSObject 12 | 13 | - (void)operation; 14 | 15 | @end 16 | -------------------------------------------------------------------------------- /设计模式/DesignPatten/Adapter/Target.m: -------------------------------------------------------------------------------- 1 | // 2 | // Target.m 3 | // DesignPatten 4 | // 5 | // Created by yangyang38 on 2018/3/17. 6 | // Copyright © 2018年 yangyang. All rights reserved. 7 | // 8 | 9 | #import "Target.h" 10 | 11 | @implementation Target 12 | 13 | - (void)operation 14 | { 15 | // 原有的具体业务逻辑 16 | } 17 | 18 | @end 19 | -------------------------------------------------------------------------------- /设计模式/DesignPatten/Bridge/BaseObjectA.h: -------------------------------------------------------------------------------- 1 | // 2 | // BaseObjectA.h 3 | // DesignPatten 4 | // 5 | // Created by yangyang38 on 2018/3/18. 6 | // Copyright © 2018年 yangyang. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "BaseObjectB.h" 11 | @interface BaseObjectA : NSObject 12 | 13 | // 桥接模式的核心实现 14 | @property (nonatomic, strong) BaseObjectB *objB; 15 | 16 | // 获取数据 17 | - (void)handle; 18 | 19 | @end 20 | -------------------------------------------------------------------------------- /设计模式/DesignPatten/Bridge/BaseObjectA.m: -------------------------------------------------------------------------------- 1 | // 2 | // BaseObjectA.m 3 | // DesignPatten 4 | // 5 | // Created by yangyang38 on 2018/3/18. 6 | // Copyright © 2018年 yangyang. All rights reserved. 7 | // 8 | 9 | #import "BaseObjectA.h" 10 | 11 | @implementation BaseObjectA 12 | 13 | /* 14 | A1 --> B1、B2、B3 3种 15 | A2 --> B1、B2、B3 3种 16 | A3 --> B1、B2、B3 3种 17 | */ 18 | - (void)handle 19 | { 20 | // override to subclass 21 | 22 | [self.objB fetchData]; 23 | } 24 | 25 | @end 26 | -------------------------------------------------------------------------------- /设计模式/DesignPatten/Bridge/BaseObjectB.h: -------------------------------------------------------------------------------- 1 | // 2 | // BaseObjectB.h 3 | // DesignPatten 4 | // 5 | // Created by yangyang38 on 2018/3/18. 6 | // Copyright © 2018年 yangyang. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface BaseObjectB : NSObject 12 | 13 | - (void)fetchData; 14 | 15 | @end 16 | -------------------------------------------------------------------------------- /设计模式/DesignPatten/Bridge/BaseObjectB.m: -------------------------------------------------------------------------------- 1 | // 2 | // BaseObjectB.m 3 | // DesignPatten 4 | // 5 | // Created by yangyang38 on 2018/3/18. 6 | // Copyright © 2018年 yangyang. All rights reserved. 7 | // 8 | 9 | #import "BaseObjectB.h" 10 | 11 | @implementation BaseObjectB 12 | 13 | - (void)fetchData 14 | { 15 | // override to subclass 16 | } 17 | 18 | @end 19 | -------------------------------------------------------------------------------- /设计模式/DesignPatten/Bridge/BridgeDemo.h: -------------------------------------------------------------------------------- 1 | // 2 | // BridgeDemo.h 3 | // DesignPatten 4 | // 5 | // Created by yangyang38 on 2018/3/17. 6 | // Copyright © 2018年 yangyang. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface BridgeDemo : NSObject 12 | 13 | - (void)fetch; 14 | 15 | @end 16 | -------------------------------------------------------------------------------- /设计模式/DesignPatten/Bridge/ObjectA1.h: -------------------------------------------------------------------------------- 1 | // 2 | // ObjectA1.h 3 | // DesignPatten 4 | // 5 | // Created by yangyang38 on 2018/3/18. 6 | // Copyright © 2018年 yangyang. All rights reserved. 7 | // 8 | 9 | #import "BaseObjectA.h" 10 | 11 | @interface ObjectA1 : BaseObjectA 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /设计模式/DesignPatten/Bridge/ObjectA1.m: -------------------------------------------------------------------------------- 1 | // 2 | // ObjectA1.m 3 | // DesignPatten 4 | // 5 | // Created by yangyang38 on 2018/3/18. 6 | // Copyright © 2018年 yangyang. All rights reserved. 7 | // 8 | 9 | #import "ObjectA1.h" 10 | 11 | @implementation ObjectA1 12 | 13 | - (void)handle 14 | { 15 | // before 业务逻辑操作 16 | 17 | [super handle]; 18 | 19 | // after 业务逻辑操作 20 | } 21 | 22 | 23 | @end 24 | -------------------------------------------------------------------------------- /设计模式/DesignPatten/Bridge/ObjectA2.h: -------------------------------------------------------------------------------- 1 | // 2 | // ObjectA2.h 3 | // DesignPatten 4 | // 5 | // Created by yangyang38 on 2018/3/18. 6 | // Copyright © 2018年 yangyang. All rights reserved. 7 | // 8 | 9 | #import "BaseObjectA.h" 10 | 11 | @interface ObjectA2 : BaseObjectA 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /设计模式/DesignPatten/Bridge/ObjectA2.m: -------------------------------------------------------------------------------- 1 | // 2 | // ObjectA2.m 3 | // DesignPatten 4 | // 5 | // Created by yangyang38 on 2018/3/18. 6 | // Copyright © 2018年 yangyang. All rights reserved. 7 | // 8 | 9 | #import "ObjectA2.h" 10 | 11 | @implementation ObjectA2 12 | 13 | - (void)handle 14 | { 15 | // before 业务逻辑操作 16 | 17 | [super handle]; 18 | 19 | // after 业务逻辑操作 20 | } 21 | 22 | @end 23 | -------------------------------------------------------------------------------- /设计模式/DesignPatten/Bridge/ObjectB1.h: -------------------------------------------------------------------------------- 1 | // 2 | // ObjectB1.h 3 | // DesignPatten 4 | // 5 | // Created by yangyang38 on 2018/3/18. 6 | // Copyright © 2018年 yangyang. All rights reserved. 7 | // 8 | 9 | #import "BaseObjectB.h" 10 | 11 | @interface ObjectB1 : BaseObjectB 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /设计模式/DesignPatten/Bridge/ObjectB1.m: -------------------------------------------------------------------------------- 1 | // 2 | // ObjectB1.m 3 | // DesignPatten 4 | // 5 | // Created by yangyang38 on 2018/3/18. 6 | // Copyright © 2018年 yangyang. All rights reserved. 7 | // 8 | 9 | #import "ObjectB1.h" 10 | 11 | @implementation ObjectB1 12 | 13 | - (void)fetchData{ 14 | // 具体的逻辑处理 15 | } 16 | 17 | @end 18 | -------------------------------------------------------------------------------- /设计模式/DesignPatten/Bridge/ObjectB2.h: -------------------------------------------------------------------------------- 1 | // 2 | // ObjectB2.h 3 | // DesignPatten 4 | // 5 | // Created by yangyang38 on 2018/3/18. 6 | // Copyright © 2018年 yangyang. All rights reserved. 7 | // 8 | 9 | #import "BaseObjectB.h" 10 | 11 | @interface ObjectB2 : BaseObjectB 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /设计模式/DesignPatten/Bridge/ObjectB2.m: -------------------------------------------------------------------------------- 1 | // 2 | // ObjectB2.m 3 | // DesignPatten 4 | // 5 | // Created by yangyang38 on 2018/3/18. 6 | // Copyright © 2018年 yangyang. All rights reserved. 7 | // 8 | 9 | #import "ObjectB2.h" 10 | 11 | @implementation ObjectB2 12 | 13 | - (void)fetchData{ 14 | // 具体的逻辑处理 15 | } 16 | 17 | @end 18 | -------------------------------------------------------------------------------- /设计模式/DesignPatten/Command/Command.h: -------------------------------------------------------------------------------- 1 | // 2 | // Command.h 3 | // DesignPatten 4 | // 5 | // Created by yangyang38 on 2018/3/17. 6 | // Copyright © 2018年 yangyang. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @class Command; 12 | typedef void(^CommandCompletionCallBack)(Command* cmd); 13 | 14 | @interface Command : NSObject 15 | 16 | @property (nonatomic, copy) CommandCompletionCallBack completion; 17 | 18 | - (void)execute; 19 | - (void)cancel; 20 | - (void)done; 21 | 22 | @end 23 | -------------------------------------------------------------------------------- /设计模式/DesignPatten/Command/Command.m: -------------------------------------------------------------------------------- 1 | // 2 | // Command.m 3 | // DesignPatten 4 | // 5 | // Created by yangyang38 on 2018/3/17. 6 | // Copyright © 2018年 yangyang. All rights reserved. 7 | // 8 | 9 | #import "Command.h" 10 | #import "CommandManager.h" 11 | @implementation Command 12 | 13 | - (void)execute{ 14 | 15 | //override to subclass; 16 | 17 | [self done]; 18 | } 19 | 20 | - (void)cancel{ 21 | 22 | self.completion = nil; 23 | } 24 | 25 | - (void)done 26 | { 27 | dispatch_async(dispatch_get_main_queue(), ^{ 28 | 29 | if (_completion) { 30 | _completion(self); 31 | } 32 | 33 | //释放 34 | self.completion = nil; 35 | 36 | [[CommandManager sharedInstance].arrayCommands removeObject:self]; 37 | }); 38 | } 39 | 40 | @end 41 | -------------------------------------------------------------------------------- /设计模式/DesignPatten/Command/CommandManager.h: -------------------------------------------------------------------------------- 1 | // 2 | // CommandManager.h 3 | // DesignPatten 4 | // 5 | // Created by yangyang38 on 2018/3/17. 6 | // Copyright © 2018年 yangyang. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "Command.h" 11 | @interface CommandManager : NSObject 12 | 13 | // 命令管理容器 14 | @property (nonatomic, strong) NSMutableArray *arrayCommands; 15 | 16 | // 命令管理者以单例方式呈现 17 | + (instancetype)sharedInstance; 18 | 19 | // 执行命令 20 | + (void)executeCommand:(Command *)cmd completion:(CommandCompletionCallBack)completion; 21 | 22 | // 取消命令 23 | + (void)cancelCommand:(Command *)cmd; 24 | 25 | @end 26 | -------------------------------------------------------------------------------- /设计模式/DesignPatten/DesignPatten.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /设计模式/DesignPatten/DesignPatten.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /设计模式/DesignPatten/DesignPatten/AppDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.h 3 | // DesignPatten 4 | // 5 | // Created by yangyang38 on 2018/3/17. 6 | // Copyright © 2018年 yangyang. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface AppDelegate : UIResponder 12 | 13 | @property (strong, nonatomic) UIWindow *window; 14 | 15 | 16 | @end 17 | 18 | -------------------------------------------------------------------------------- /设计模式/DesignPatten/DesignPatten/ViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.h 3 | // DesignPatten 4 | // 5 | // Created by yangyang38 on 2018/3/17. 6 | // Copyright © 2018年 yangyang. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface ViewController : UIViewController 12 | 13 | 14 | @end 15 | 16 | -------------------------------------------------------------------------------- /设计模式/DesignPatten/DesignPatten/ViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.m 3 | // DesignPatten 4 | // 5 | // Created by yangyang38 on 2018/3/17. 6 | // Copyright © 2018年 yangyang. All rights reserved. 7 | // 8 | 9 | #import "ViewController.h" 10 | 11 | @interface ViewController () 12 | 13 | @end 14 | 15 | @implementation ViewController 16 | 17 | - (void)viewDidLoad { 18 | [super viewDidLoad]; 19 | // Do any additional setup after loading the view, typically from a nib. 20 | } 21 | 22 | 23 | - (void)didReceiveMemoryWarning { 24 | [super didReceiveMemoryWarning]; 25 | // Dispose of any resources that can be recreated. 26 | } 27 | 28 | 29 | @end 30 | -------------------------------------------------------------------------------- /设计模式/DesignPatten/DesignPatten/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // DesignPatten 4 | // 5 | // Created by yangyang38 on 2018/3/17. 6 | // Copyright © 2018年 yangyang. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "AppDelegate.h" 11 | 12 | int main(int argc, char * argv[]) { 13 | @autoreleasepool { 14 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /设计模式/DesignPatten/DesignPattenUITests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | 22 | 23 | -------------------------------------------------------------------------------- /设计模式/DesignPatten/Responder/BusinessObject.h: -------------------------------------------------------------------------------- 1 | // 2 | // BusinessObject.h 3 | // DesignPatten 4 | // 5 | // Created by yangyang38 on 2018/3/17. 6 | // Copyright © 2018年 yangyang. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @class BusinessObject; 12 | 13 | typedef void(^CompletionBlock)(BOOL handled); 14 | typedef void(^ResultBlock)(BusinessObject *handler, BOOL handled); 15 | 16 | @interface BusinessObject : NSObject 17 | 18 | // 下一个响应者(响应链构成的关键) 19 | @property (nonatomic, strong) BusinessObject *nextBusiness; 20 | // 响应者的处理方法 21 | - (void)handle:(ResultBlock)result; 22 | 23 | // 各个业务在该方法当中做实际业务处理 24 | - (void)handleBusiness:(CompletionBlock)completion; 25 | @end 26 | -------------------------------------------------------------------------------- /设计模式/DesignPatten/SingleInstance/Mooc.h: -------------------------------------------------------------------------------- 1 | // 2 | // Mooc.h 3 | // DesignPatten 4 | // 5 | // Created by yangyang38 on 2018/3/17. 6 | // Copyright © 2018年 yangyang. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface Mooc : NSObject 12 | 13 | + (id)sharedInstance; 14 | 15 | @end 16 | -------------------------------------------------------------------------------- /设计模式/DesignPatten/SingleInstance/Mooc.m: -------------------------------------------------------------------------------- 1 | // 2 | // Mooc.m 3 | // DesignPatten 4 | // 5 | // Created by yangyang38 on 2018/3/17. 6 | // Copyright © 2018年 yangyang. All rights reserved. 7 | // 8 | 9 | #import "Mooc.h" 10 | 11 | @implementation Mooc 12 | 13 | + (id)sharedInstance 14 | { 15 | // 静态局部变量 16 | static Mooc *instance = nil; 17 | 18 | // 通过dispatch_once方式 确保instance在多线程环境下只被创建一次 19 | static dispatch_once_t onceToken; 20 | dispatch_once(&onceToken, ^{ 21 | // 创建实例 22 | instance = [[super allocWithZone:NULL] init]; 23 | }); 24 | return instance; 25 | } 26 | 27 | // 重写方法【必不可少】 28 | + (id)allocWithZone:(struct _NSZone *)zone{ 29 | return [self sharedInstance]; 30 | } 31 | 32 | // 重写方法【必不可少】 33 | - (id)copyWithZone:(nullable NSZone *)zone{ 34 | return self; 35 | } 36 | 37 | @end 38 | -------------------------------------------------------------------------------- /读书笔记/Effective_Objective-C.md: -------------------------------------------------------------------------------- 1 | ### Effective Objective-C 阅读笔记 2 | 3 | ![](https://liberalism-image-1.oss-cn-beijing.aliyuncs.com/Effective%20Objective-C%20%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/%E5%B0%81%E9%9D%A2.jpg) 4 | 5 | 6 | -------------------------------------------------------------------------------- /调试技巧/1.第一题.md: -------------------------------------------------------------------------------- 1 | ## LLDB 调试命令 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /调试技巧/10.第十题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /调试技巧/11.第十一题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /调试技巧/12.第十二题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /调试技巧/13.第十三题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /调试技巧/14.第十四题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /调试技巧/15.第十五题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /调试技巧/16.第十六题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /调试技巧/17.第十七题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /调试技巧/18.第十八题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /调试技巧/19.第十九题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /调试技巧/2.第二题.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /调试技巧/20.第二十题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /调试技巧/21.第二十一题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /调试技巧/22.第二十二题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /调试技巧/23.第二十三题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /调试技巧/3.第三题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /调试技巧/4.第四题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /调试技巧/5.第五题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /调试技巧/6.第六题.md: -------------------------------------------------------------------------------- 1 | ## 6.`iOS` 常见的崩溃类型有哪些? 2 | 3 | 4 | * unrecognized selector crash 5 | * KVO crash 6 | * NSNotification crash 7 | * NSTimer crash 8 | * Container crash 9 | * NSString crash 10 | * Bad Access crash (野指针) 11 | * UI not on Main Thread Crash 12 | 13 | 14 | -------------------------------------------------------------------------------- /调试技巧/7.第七题.md: -------------------------------------------------------------------------------- 1 | ## 7.当页面 `AutoLayout` 出现了问题,怎样快速调试? 2 | 3 | 4 | 可以参考[这篇文章](http://nshint.io/blog/2015/08/17/autolayout-breakpoints/) 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /调试技巧/8.第八题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /调试技巧/9.第九题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /逆向及安全/1.第一题.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /逆向及安全/10.第十题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /逆向及安全/11.第十一题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /逆向及安全/12.第十二题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /逆向及安全/13.第十三题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /逆向及安全/14.第十四题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /逆向及安全/15.第十五题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /逆向及安全/16.第十六题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /逆向及安全/17.第十七题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /逆向及安全/18.第十八题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /逆向及安全/19.第十九题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /逆向及安全/2.第二题.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /逆向及安全/20.第二十题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /逆向及安全/21.第二十一题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /逆向及安全/22.第二十二题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /逆向及安全/23.第二十三题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /逆向及安全/3.第三题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /逆向及安全/4.第四题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /逆向及安全/5.第五题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /逆向及安全/6.第六题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /逆向及安全/7.第七题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | * 2.`分类` 不能给系统的类添加方法。 5 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 6 | 7 | -------------------------------------------------------------------------------- /逆向及安全/8.第八题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /逆向及安全/9.第九题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /音频处理/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liberalisman/iOS-InterviewQuestion-collection/c91a492ab4f90538373a62579f43021546f55329/音频处理/.DS_Store -------------------------------------------------------------------------------- /音频处理/1.第一题.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /音频处理/10.第十题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /音频处理/11.第十一题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /音频处理/12.第十二题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /音频处理/13.第十三题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /音频处理/2.第二题.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /音频处理/3.第三题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /音频处理/4.第四题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /音频处理/5.第五题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /音频处理/6.第六题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /音频处理/7.第七题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | * 2.`分类` 不能给系统的类添加方法。 5 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 6 | 7 | -------------------------------------------------------------------------------- /音频处理/8.第八题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /音频处理/9.第九题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /项目架构/1.第一题.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /项目架构/10.第十题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /项目架构/11.第十一题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /项目架构/12.第十二题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /项目架构/13.第十三题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /项目架构/14.第十四题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /项目架构/15.第十五题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /项目架构/16.第十六题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /项目架构/17.第十七题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /项目架构/18.第十八题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /项目架构/19.第十九题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /项目架构/2.第二题.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /项目架构/20.第二十题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /项目架构/21.第二十一题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /项目架构/22.第二十二题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /项目架构/23.第二十三题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /项目架构/3.第三题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /项目架构/4.第四题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /项目架构/5.第五题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /项目架构/6.第六题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /项目架构/7.第七题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | * 2.`分类` 不能给系统的类添加方法。 5 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 6 | 7 | -------------------------------------------------------------------------------- /项目架构/8.第八题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | -------------------------------------------------------------------------------- /项目架构/9.第九题.md: -------------------------------------------------------------------------------- 1 | ### 分类和类拓展的区别? 2 | 3 | * 1.`分类` 的加载在 `运行时`,`类拓展` 的加载在 `编译时`。 4 | 5 | * 2.`分类` 不能给系统的类添加方法。 6 | * 3.`类拓展` 只以声明的形式存在,一般存在 .m 文件中。 7 | 8 | --------------------------------------------------------------------------------