ISA Swizzling 《iOS编程实战》

《iOS编程实战》24.6节 方法混写和ISA混写的区别 KVO是通过ISA混写实现的,这样系统框架就可以在我们的类中注入通知代码,一如把代码注入系统框架。 ISA混写是修改某一个特定对象的类,不会影响这个类的其他对象。 修改对象的类为自定义的类后,自定义类中的方法就能执行,我们可以在这些方法中添加我们想要的功能。当然,这些方法都存在于修改前的类中,所以自定义类都是修改前类的子类。

NSObject+SetClass.h

#import <Foundation/Foundation.h>
@interface NSObject (SetClass)
- (void)setClass:(Class)aClass;
@end
复制代码

NSObject+SetClass.m

#import "NSObject+SetClass.h"
#import <objc/runtime.h>
@implementation NSObject (SetClass)
- (void)setClass:(Class)aClass {
    //确保两个类大小一样,也就是说aClass不能声明任何 ivar 或者合成属性 
    NSAssert(class_getInstanceSize([self class]) == class_getInstanceSize(aClass), @"Classes must be the same size to swizzle.");

    //设置一个对象的类,这里改变 self 的类为 aClass
    //Class object_setClass(id object, Class cls)
    object_setClass(self, aClass);}
@end
复制代码

MYNotificationCenter.h

#import <Foundation/Foundation.h>
@interface MYNotificationCenter : NSNotificationCenter    
// 这里绝对不要定义任何实例变量 ivar 或者合成属性
@end
复制代码

MYNotificationCenter.m

#import "MYNotificationCenter.h"
@implementation MYNotificationCenter

- (void)addObserver:(id)observer selector:(SEL)aSelector name:(NSString *)aName object:(id)anObject
{
   // 添加的代码
    NSLog(@"Adding observer: %@", observer);
   //  调用自定义类的父类方法,保证原来功能不缺失
   [super addObserver:observer selector:aSelector name:aName
                object:anObject];}
@end
复制代码

在程序开始的某个地方执行方法混写:

#import "NSObject+SetClass.h"
#import "MYNotificationCenter.h"

NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
[center setClass:[MYNotificationCenter class]];
//之后,调用系统[NSNotificationCenter defaultCenter]时会自动替换会自定义的[MYNotificationCenter defaultCenter]

复制代码
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值