美文网首页
RacDealloc交换

RacDealloc交换

作者: 我是小胡胡123 | 来源:发表于2018-02-11 15:27 被阅读24次
SEL deallocSelector = sel_registerName("dealloc");

[[self  rac_signalForSelector:deallocSelector] subscribeNext:^(RACTuple * _Nullable x) {
    NSLog(@"111: %@",x);
} completed:^{
    NSLog(@"completed") ;
}];

[[self  rac_signalForSelector:@selector(aa)] subscribeNext:^(RACTuple * _Nullable x) {
    NSLog(@"12345");
}];

不能同时使用以上的方法。 dealloc就用swizzleDeallocIfNeeded的方法。
其它的普通的Selector方法用NSObjectRACSignalForSelector。

[self.rac_deallocDisposable  addDisposable:[RACDisposable disposableWithBlock:^{
    NSLog(@"11");
}]];
[self.rac_willDeallocSignal subscribeCompleted:^{
    NSLog(@"111");
}];

先执行block里面的方法,再调用主类的dealloc方法。

self.rac_deallocDisposable

  • (RACCompoundDisposable *)rac_deallocDisposable {
    @synchronized (self) {
    RACCompoundDisposable *compoundDisposable = objc_getAssociatedObject(self, RACObjectCompoundDisposable);
    if (compoundDisposable != nil) return compoundDisposable;

      swizzleDeallocIfNeeded(self.class);
    
      compoundDisposable = [RACCompoundDisposable compoundDisposable];
      objc_setAssociatedObject(self, RACObjectCompoundDisposable, compoundDisposable, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    
      return compoundDisposable;
    

    }
    }

  • (RACSignal *)rac_willDeallocSignal {
    RACSignal *signal = objc_getAssociatedObject(self, _cmd);
    if (signal != nil) return signal;

    RACReplaySubject *subject = [RACReplaySubject subject];

    [self.rac_deallocDisposable addDisposable:[RACDisposable disposableWithBlock:^{
    // 给当前保存的订阅者发送完成;;; 给新添加的订阅者发送所有的已保存的消息; 如果没有完成, 保存新添加的订阅者。 如果完成了, 就不增加订阅者了。
    [subject sendCompleted];
    }]];

    objc_setAssociatedObject(self, _cmd, subject, OBJC_ASSOCIATION_RETAIN);

    return subject;
    }

static void swizzleDeallocIfNeeded(Class classToSwizzle) {
@synchronized (swizzledClasses()) {
NSString *className = NSStringFromClass(classToSwizzle);
if ([swizzledClasses() containsObject:className]) return;

    SEL deallocSelector = sel_registerName("dealloc");

    __block void (*originalDealloc)(__unsafe_unretained id, SEL) = NULL;

    id newDealloc = ^(__unsafe_unretained id self) {
        RACCompoundDisposable *compoundDisposable = objc_getAssociatedObject(self, RACObjectCompoundDisposable);
        [compoundDisposable dispose];

        if (originalDealloc == NULL) {
            struct objc_super superInfo = {
                .receiver = self,
                .super_class = class_getSuperclass(classToSwizzle)
            };
                // 调用实现了的方法
            void (*msgSend)(struct objc_super *, SEL) = (__typeof__(msgSend))objc_msgSendSuper;
            msgSend(&superInfo, deallocSelector);
        } else {
            originalDealloc(self, deallocSelector);
        }
    };
    
    IMP newDeallocIMP = imp_implementationWithBlock(newDealloc);
    
        // 增加IMP失败, 说明类当前实现了Sel
    if (!class_addMethod(classToSwizzle, deallocSelector, newDeallocIMP, "v@:")) {
        // The class already contains a method implementation.
        Method deallocMethod = class_getInstanceMethod(classToSwizzle, deallocSelector);
        
        // We need to store original implementation before setting new implementation
        // in case method is called at the time of setting.
        originalDealloc = (__typeof__(originalDealloc))method_getImplementation(deallocMethod);
        
            // 方法交换 
        // We need to store original implementation again, in case it just changed.
        originalDealloc = (__typeof__(originalDealloc))method_setImplementation(deallocMethod, newDeallocIMP);
    }

    [swizzledClasses() addObject:className];
}

}

相关文章

  • RacDealloc交换

    不能同时使用以上的方法。 dealloc就用swizzleDeallocIfNeeded的方法。其它的普通的Se...

  • 歌词:交换

    呼吸交换 心跳交换 身体交换 思绪都交换 疼痛交换 呼喊交换 颤动交换 全部都交换 可会更懂你 可惜不懂你 可以陪...

  • 1.3 交换方式

    ##交换技术分为两种 - 电路交换 - 分组交换 ###分组交换又分为 两种 - 虚电路交换 - 数据报交换

  • 组网设备

    一、交换机 1.交换机分类 (1)以交换方式分 存储转发式交换、直通式交换、碎片过滤式交换。 (2)以交换协议层分...

  • rabbitmq06 交换机

    交换机 direct(直连交换机) topic(主题交换机) headers(头部交换机) fanout(扇形交换...

  • TCP/IP 学习碎片

    电路交换与分组交换 电路交换中,交换机主要负责数据的中转处理。计算机首先被连接到交换机上,而交换机与交换机之间则由...

  • 职业人的三大思维之结果思维

    2.结果思维 谈到交换,苦劳能不能交换?疲劳能不能交换?牢骚能不能交换?交换首先要明确什么才是可以拿来被交换的。答...

  • Lecture 2 Assignment (20190306)

    什么是交换?使用何种设备来实现交换任务? 请简要描述电路交换的过程。 电路交换具有哪些特点? 为什么说电路交换不适...

  • 交换

    本期初级班课程重点《交换》 传统社会——你给别人打工,别人按月给你发工资,付出劳动力换取微薄的薪水(挣钱);你将挣...

  • 交换

    原本鸡飞狗跳,女人呼、小孩喊的斋南村,这几天异常清静。静得连烟囱上的炊烟也懒得袅袅绕绕了。 八个月大的五景半醒半睡...

网友评论

      本文标题:RacDealloc交换

      本文链接:https://www.haomeiwen.com/subject/ymoktftx.html