zoukankan      html  css  js  c++  java
  • ReactiveCocoa内存管理

    1.我们创建的管道是如何被保存的么?

    ReactiveCocoa设计的目的之一是允许这样一种编程样式,即管道可以匿名创建。到目前为止,我们的管道都是这么处理的。为了支持这种模式,ReactiveCocoa维护了一个全局的信号集合。如果信号有一个或多个订阅者,它就是可用的。如果所有订阅者都被移除了,信号就被释放了。 

    2.如何取消对信号的订阅?

    在一个completed事件或error事件后,一个订阅者会自动将自己移除。手动移除可能通过RACDisposable来完成。RACSignal的所有订阅方法都返回一个RACDisposable实例,我们可以调用它的dispose方法来手动移除订阅者。如下代码所示:

    RACSignal *backgroundColorSignal =
        [self.searchText.rac_textSignal
         map:^id(NSString *text) {
             return [self isValidSearchText:text] ? [UIColor whiteColor] : [UIColor yellowColor];
         }];
    
    RACDisposable *subscripion =
        [backgroundColorSignal subscribeNext:^(UIColor *color) {
            self.searchText.backgroundColor = color;
        }];
    
    // 在某个位置调用
    [subscripion dispose];

    当然实际上我们不需要这样来写,只需要知道是这么回事就行。

    注意:如果我们创建了一个管道,但不去订阅它,则管理永远不会执行,包括任何如doNext:块这样的附加操作。

    3.避免循环引用

    ReactiveCocoa框架给我们提供了一个更好的选择。首先导入以下头文件:

    #import <RACEXTScope.h>
    

    然后使用以下代码:

    @weakify(self)
    
    [[self.searchText.rac_textSignal map:^id(NSString *text) {
        return [self isValidSearchText:text] ? [UIColor whiteColor] : [UIColor yellowColor];
    }] subscribeNext:^(UIColor *color) {
        @strongify(self)
        self.searchText.backgroundColor = color;
    }];

    宏@weakify与@strongify在Extended Objective-C库中引用,它们包含在ReactiveCocoa框架中。@weakify允许我们创建一些影子变量,它是都是弱引用(可以同时创建多个),@strongify允许创建变量的强引用,这些变量是先前传递给@weakify的。

  • 相关阅读:
    【leetcode】299. 猜数字游戏
    【leetcode】300. 最长递增子序列
    【leetcode】223. 矩形面积
    【leetcode】222. 完全二叉树的节点个数
    【leetcode】229. 求众数 II
    【leetcode】215. 数组中的第K个最大元素
    【leetcode】221. 最大正方形
    【leetcode】216. 组合总和 III
    【leetcode】213. 打家劫舍 II
    【leetcode】210. 课程表 II
  • 原文地址:https://www.cnblogs.com/guoxiaoqian/p/4665741.html
Copyright © 2011-2022 走看看