-
综合
ibireme的技术博客
Jamin's BLOG
Sunny的技术博客
MrPeak杂货铺
Holko.pl
Casa Taloyum
ObjC_中国_期刊
一名全栈设计师的Mac工具箱
Github-iOS备忘 :分好类且很全的第三方库,原地址
iOS/React/Swift/React Native的一点心得 -
runloop & block
深入理解runloop
objc 中的 block
Objective-C Runtime 1小时入门教程:runtime的基本概念,易懂幽默,代码beautiful
Method Swizzling
利用Objective-C运行时hook函数的三种方法
如何自己动手实现 KVO
谈谈 KVO -
UI篇及性能优化
『有趣的 Layer』CAGradientLayer 与 mask
iOS 内存泄漏监测自动化
内存恶鬼drawRect - 谈画图功能的内存优化
如何正确地写好一个界面
iOS 保持界面流畅的技巧:性能优化建议
iOS应用UI线程卡顿监控原理:每隔一段时间检测一次 1. 在UI线程空闲的时候发送开始检测通知 2. worker线程收到检测通知时,隔一帧的时间在UI线程发送检测结束通知,并设置超时处理 3. 如果一帧时间内收到检测结束通知,则说明此时UI线程空闲,不卡顿 4. 如果超时,则说明UI线程在忙,暂停UI线程,打印调用栈信息,随后UI线程继续运行
iOS Core Animation: Advanced Techniques中文译本
iOS UILabel复制粘贴效果
iOS设备参数
ios设备
-
数据
sqlite
iOS集合的深复制与浅复制
认识CoreData—初识CoreData
认识CoreData—基础使用
认识CoreData—使用进阶 -
架构
iOS应用架构谈 开篇
杂谈: MVC/MVP/MVVM
设计模式:虽然是java的,但也可以借鉴
MVVM 介绍
ReactiveCocoa入门教程:第一部分
从NSArray看类簇 -
网络篇
AFNetworking到底做了什么?
AFNetworking与ASIHTTPRequest的区别
NSURLSession与NSURLConnection区别
iOS开发中的HTTPS
iOS安全系列之一:HTTPS
关于iOS socket都在这里了
cookie (储存在用户本地终端上的数据) -
调试
iOS开发调试技巧总结
熟练使用 LLDB,让你调试事半功倍:详细介绍了lldb的相关命令 -
算法
常用排序算法总结(一):C、图示
常用排序算法总结(二)
排序算法总结:java
八大排序算法:C++
算法书:剑指 offer、编程之美 -
多线程
关于iOS多线程,你看我就够了 -
其他
向iOS开发者介绍C++(一)
向iOS开发者介绍C++(二)
iOS 自带地图(MapKit、MKMapView)轨迹渐变
iOS原生地图MKMapView添加半透明遮盖物和轨迹起点、终点等自定义annotation
[React Native]从源码一步一步解析它的实现原理
iOS开发系列文章(持续更新……) -
总结与笔记
-
分类:能声明属性,但不会自动生成_xxx变量,也不会自动实现get、set方法,需手动实现
-
imageNamed:苹果解释:第一次使用到图片时从本地加载图片并缓存,缓存由系统控制,随时可能清除缓存以便释放内存,但只会释放那些当前没使用的图片
-
id & class 笔记
// id 为实例对象指针 typedef struct objc_object *id; struct objc_object { // id 对象 的 isa 指针指向类对象, // 类对象里面存储相关的成员对象、成员方法等 Class isa OBJC_ISA_AVAILABILITY; }; // class 为类对象指针 typedef struct objc_class *Class; struct objc_class { // d 对象 的 isa 指针指向metaclass,类对象里面存储相关的类对象、类方法等 // metaclass Class isa OBJC_ISA_AVAILABILITY; #if !__OBJC2__ // 父类 Class super_class OBJC2_UNAVAILABLE; // 类名 const char *name OBJC2_UNAVAILABLE; // 类的版本信息,默认为0,可以通过runtime函数class_setVersion或者class_getVersion进行修改、读取 long version OBJC2_UNAVAILABLE; // 类信息,供运行时期使用的一些位标识,如CLS_CLASS (0x1L) 表示该类为普通 class,其中包含实例方法和变量;CLS_META (0x2L) 表示该类为 metaclass,其中包含类方法; long info OBJC2_UNAVAILABLE; // 该类的实例变量大小(包括从父类继承下来的实例变量) long instance_size OBJC2_UNAVAILABLE; // 该类的成员变量地址列表 struct objc_ivar_list *ivars OBJC2_UNAVAILABLE; // 方法地址列表,与 info 的一些标志位有关,如CLS_CLASS (0x1L),则存储实例方法,如CLS_META (0x2L),则存储类方法; struct objc_method_list **methodLists OBJC2_UNAVAILABLE; // 缓存最近使用的方法地址,用于提升效率; struct objc_cache *cache OBJC2_UNAVAILABLE; // 存储该类声明遵守的协议的列表 struct objc_protocol_list *protocols OBJC2_UNAVAILABLE; #endif } 1. objc_object(实例对象)中isa指针:指向的类结构称为class(即该对象所属的类) 其中存放着普通成员变量与动态方法(“-”开头的方法) 2. objc_class(元类)中的isa指针:指向的类结构称为metaclass, 其中存放着static类型的成员变量与static类型的方法(“+”开头的方法) 3. 获取对象的类:object_getClass(obj) 或 [obj class] 4. 获取类的metaClass: objc_getMetaClass("className"); 5. 修改obj的isa指针:object_setClass(obj, class)
-
Method Swizzling笔记
#import "UIViewController+swizze.h" #import <objc/runtime.h> #import <objc/message.h> @implementation UIViewController (swizze) /* 相关概念 1. Selector(SEL):函数的唯一标识,在运行时根据方法的名字、参数序列生成的C字符串。 2. Implementation(IMP):函数的实现入口指针 3. Method:Selector和Implementation的绑定 4. 三者联系:Class维护一个消息分发列表,每个消息列表的入口是一个Method,Method映射一对键值对,value是SEL,key是IMP。 5. swizzling原理: 修改了类的消息分发列表,将已有的方法和自定义方法的IMP进行交换,即交换两方法的实现入口指针; */ + (void)load { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ Class class = [self class]; SEL originalSelector = @selector(viewWillAppear:); SEL swizzledSelector = @selector(xxx_viewWillAppear:); // 获取成员方法 Method originalMethod = class_getInstanceMethod(class, originalSelector); Method swizzledMethod = class_getInstanceMethod(class, swizzledSelector); // 获取类方法(修改类方法时用这个) // When swizzling a class method, use the following: // Class class = object_getClass((id)self); // ... // Method originalMethod = class_getClassMethod(class, originalSelector); // Method swizzledMethod = class_getClassMethod(class, swizzledSelector); // 1.1 添加原始方法SEL的IMP, // 若成功,说明之前就没有该方法; // 失败,则说明方法之前已经存在 BOOL didAddMethod = class_addMethod(class, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod)); if (didAddMethod) { // 1.2 修改自定义方法的IMP class_replaceMethod(class,swizzledSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod)); } else { // 2.0 或交换两方法的IMP method_exchangeImplementations(originalMethod, swizzledMethod); } }); } // 自定义的方法 - (void)xxx_viewWillAppear:(BOOL)animated { [self xxx_viewWillAppear:animated]; NSLog(@"viewWillAppear: %@", self); } @end
-
网友评论