美文网首页专题:临时区iOS DeveloperiOS-周边收集
【面试题】masonry为什么没有导致循环引用?

【面试题】masonry为什么没有导致循环引用?

作者: 不上火喝纯净水 | 来源:发表于2017-04-21 22:23 被阅读559次

我要说:鉴于,这个问题过于简单,中高级请略过此文,以下仅针对初初级iOS开发人员:

Masonry是一个轻量级的自动布局框架,在iOS开发界被广泛采用,先看如下代码

    @weakify(self);
    [self.mainTable mas_makeConstraints:^(MASConstraintMaker *make) {
        @strongify(self);
        make.top.(self.view)).offset(100);
        make.left.right.bottom.equalTo(self.view);
    }];

为了避免出现block的循环引用,我们已经养成了很好的习惯,weak/strong破除循环引用,更简单的是借用RAC中定义的@weakify/@strongify这对宏,几乎针对所有的block我们都可以使用如下方法来避免循环引用。

这么写没有任何问题,只是我们要知道这里并不存在循环引用问题,所有完全没有必要使用weak/strong来破除循环引用。虽然block块内确实对调用对象有强引用,block的变量捕捉会使得调用对象引用计数+1.但是block循环引用的前提条件是调用对象直接或者间接对block持有强引用。而masonry的block方法实现中并不涉及。

查看masonry源码可以看到究竟:masonry中设置布局的方法中的block对象并没有被View所引用,而是直接在方法内部同步执行,执行完以后block将释放,其中捕捉的外部变量的引用计数也将还原到之前。

//
//  UIView+MASAdditions.m
//  Masonry
//
//  Created by Jonas Budelmann on 20/07/13.
//  Copyright (c) 2013 cloudling. All rights reserved.
//

#import "View+MASAdditions.h"
#import <objc/runtime.h>

@implementation MAS_VIEW (MASAdditions)

- (NSArray *)mas_makeConstraints:(void(^)(MASConstraintMaker *))block {
    self.translatesAutoresizingMaskIntoConstraints = NO;
    MASConstraintMaker *constraintMaker = [[MASConstraintMaker alloc] initWithView:self];
    block(constraintMaker);
    return [constraintMaker install];
}

- (NSArray *)mas_updateConstraints:(void(^)(MASConstraintMaker *))block {
    self.translatesAutoresizingMaskIntoConstraints = NO;
    MASConstraintMaker *constraintMaker = [[MASConstraintMaker alloc] initWithView:self];
    constraintMaker.updateExisting = YES;
    block(constraintMaker);
    return [constraintMaker install];
}

- (NSArray *)mas_remakeConstraints:(void(^)(MASConstraintMaker *make))block {
    self.translatesAutoresizingMaskIntoConstraints = NO;
    MASConstraintMaker *constraintMaker = [[MASConstraintMaker alloc] initWithView:self];
    constraintMaker.removeExisting = YES;
    block(constraintMaker);
    return [constraintMaker install];
}

相关文章

  • 【面试题】masonry为什么没有导致循环引用?

    我要说:鉴于,这个问题过于简单,中高级请略过此文,以下仅针对初初级iOS开发人员: Masonry是一个轻量级的自...

  • iOS masonry为什么没有导致循环引用?

    block循环引用的前提条件是调用对象直接或者间接对block持有强引用。而masonry的block方法实现中并...

  • 关于 Block 导致的循环引用

    ,经常说在 block 里面很容易导致循环引用(retain cycle),可是为什么会导致循环引用,却不是特别理...

  • iOS经典问题

    1.为什么iOS的Masonry中的self不会循环引用?http://www.jianshu.com/p/1c8...

  • Block循环引用(五)

    1、什么是循环引用?循环引用会导致什么问题? 相互持有,双方都无法释放,导致循环引用,A强引用着B,B强引用着A ...

  • iOS循环引用

    什么是循环引用? 循环引用:是指多个对象相互引用,导致内存无法释放,从而导致内存泄露。 循环引用的四种情况? 父类...

  • (二十四)[Swift]循环引用

    1.什么是循环引用 两个对象通过属性互相强引用对方,导致无法正常释放 情境代码 不会循环引用 会导致循环引用 2....

  • NSTimer引用循环 2019-11-05

    问题 采用如下方法使用定时器会导致引用循环: WeakSelf失效 既然是强引用导致循环引用,那么用__weak修...

  • iOS定时器循环引用分析及完美解决方案

    目录 1.NSTimer导致的循环引用分析2.NSTimer循环引用解决思路误区3.NSTimer循环引用解决方案...

  • iOS 循环引用导致内存泄漏

    首先我们需要先了解什么是循环引用 循环引用简单来说循环引用就是 A持有B B持有C C持有A ,因为相互持有,导致...

网友评论

  • Link913:这个宏很蛋疼还不如用weakself...有时会丧失代码补全,其实书里面讲的挺好的,不能把所有保留环的责任交给调用者,自身应该也在使用完这个block后置为nil.
    不上火喝纯净水:确实, 我也是希望我们开发者不要总想着一劳永逸的滥用weak/strong,多思考一下实际原理。

本文标题:【面试题】masonry为什么没有导致循环引用?

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