摘要: - (void)encodeWithCoder:(NSCoder *)aCoder { NSLog(@"%s",__func__); unsigned int count = 0; Class cls = self.class; Ivar * varList = NULL; objc_propert 阅读全文
posted @ 2017-03-01 15:41 tiankongzhicheng 阅读(187) 评论(0) 推荐(0) 编辑
摘要: 之前所说的消息转发虽然功能强大,但需要我们了解并且能更改对应类的源代码,因为我们需要实现自己的转发逻辑。当我们无法触碰到某个类的源代码,却想更改这个类某个方法的实现时,该怎么办呢?可能继承类并重写方法是一种想法,但是有时无法达到目的。这里介绍的是 Method Swizzling ,它通过重新映射方 阅读全文
posted @ 2017-03-01 13:38 tiankongzhicheng 阅读(973) 评论(0) 推荐(0) 编辑
摘要: Objective-C是动态语言,每个方法在运行时会被动态转为消息发送,即:objc_msgSend(receiver, selector),整个过程介绍如下: objc在向一个对象发送消息时,runtime库会根据对象的isa指针找到该对象实际所属的类 然后在该类中的方法列表以及其父类方法列表中寻 阅读全文
posted @ 2017-03-01 13:37 tiankongzhicheng 阅读(217) 评论(0) 推荐(0) 编辑
摘要: 不能向编译后得到的类中增加实例变量!能向运行时创建的类中添加实例变量! 因为编译后的类已经注册在runtime中,类结构体中的objc_ivar_list 实例变量的链表和instance_size实例变量的内存大小已经确定,同时runtime 会调用class_setIvarLayout 或 cl 阅读全文
posted @ 2017-03-01 13:36 tiankongzhicheng 阅读(414) 评论(0) 推荐(0) 编辑
摘要: weak策略表明该属性定义了一种“非拥有关系” (nonowning relationship)。为这种属性设置新值时,设置方法既不保留新值,也不释放旧值。此特质同assign类似;然而在属性所指的对象遭到摧毁时,属性值也会清空(nil out) 那么runtime如何实现weak变量的自动置nil 阅读全文
posted @ 2017-03-01 13:33 tiankongzhicheng 阅读(418) 评论(0) 推荐(0) 编辑
摘要: IMP在objc.h中的定义是: typedef id (*IMP)(id, SEL, ...); 它是一个函数的指针。它是由编译器编译生成的。当你发起一个objc消息时,它会找到那段代码执行。IMP函数指针指向了这个方法的具体的实现。我们得到这个函数的指针可以直接绕过消息的传递阶段,直接执行。 你 阅读全文
posted @ 2017-03-01 13:32 tiankongzhicheng 阅读(409) 评论(0) 推荐(0) 编辑
摘要: //分类的代码 + (void)load { Method placeholder = class_getInstanceMethod(self, @selector(setPlaceholder:)); Method placeBS_holder = class_getInstanceMethod 阅读全文
posted @ 2017-03-01 11:35 tiankongzhicheng 阅读(123) 评论(0) 推荐(0) 编辑
摘要: //根据正则表达式过滤非法的字符串 + (NSString *)filterCharactor:(NSString *)str withRegexString:(NSString *)regexStr { NSError * error = nil; NSRegularExpression * ex 阅读全文
posted @ 2017-03-01 11:21 tiankongzhicheng 阅读(323) 评论(0) 推荐(0) 编辑