一面【扫盲篇】

在这里插入图片描述

一面【扫盲篇】

-(CGSize)intrinsicContentSize的作用?

1、Autolayout中作为UIview的只读属性

2、直译固有大小,如果没有指定控件的大小,需要重写相当于占位。

场景1: 系统导航内自定义view,需要重写改属性。否则大小会被导航栏改变。

场景2: UIImageView相关不指定图片,不设置本身大小,则回抛约束警告。

编写一个循环引用的代码?

循环引用(交叉引用属于其中一种):双方互相强引用对方

场景1: 设计代理时候,delegate的声明需要使用weak或者assign修饰。使用Strong则会产生循环引用。

场景2: A->B->C->D->A(大环引用)

场景3: Block内部持用外部属性,不实用__weak修饰

Assign和Weak区别?

Assign

  • 修饰基本数据类型

    • int
    • float
    • bool
  • 修饰对象数据类型【不改变引用计数】

  • 修饰的对象释放后,继续指向其地址,产生悬垂指针(野指针)

    • 内粗泄漏
    • 程序异常崩溃 【EXC_BAD_ACCESS】

Weak

  • 仅修饰对象数据类型

    • 不改变引用计数
    • 对象释放后,自动设置为nil
  • 延伸:

    • 对象释放后为什么会被设置为nil?

      • 1、当一个对象对销毁后执行dealloc

      • 2、dealloc实现会调用一些列弱引用清除的函数[ojb4源码可以查看]

        • dealloc
        • objc_rootDealloc
        • object_dispose
        • objc_destructInstance
        • objc_clear_deallocating
        • weak_clear_no_lock
      • 3、根据当前对象的指针查找弱引用表,把当前对象相对应的弱引用(数组)进行循环将其指针挨个设置为nil

延伸

  • 读写相关

    • readwrite[默认]
    • readonly
  • 原子性

    • atomic

      • 赋值和获取是线程安全的

      • 操作则可能不是【修饰数组】

        • 场景1: 对数组的赋值和获取元素是安全的
        • 场景2: 对数组的移除和新增元素则不是安全的
    • nonatomic

  • 引用计数

    • retain【ARC】

      • MRC下重写Retain修饰变量的setter方法?

        • -(void)setObj:(id)obj{ if (_obj != obj){[_obj release]; _obj = [obj retain]}}
        • 如果源对象和传入的对象Obj不相等,则对源对象进行release操作,对新传入的对象进行retain操作再进行赋值。
        • 进行!= 判断 (防止传入的对象刚好是原对象,则原对象删除了。在赋值就会出错)
    • strong【MRC】

    • assign

      • 基本数据类型
      • 对象数据类型
    • unsafe_unretained【MRC产物】

      • 仅修饰对象数据类型
      • 不自动设置为nil
    • copy

      • 浅拷贝[指针copy]

        • 例子:@property(copy)NSMutableArray * muArray;

          • 浅拷贝是对内存地址的copy

          • 即让copy对象和源对象的指针指向同一片内存空间

          • 结论:

            • 增加被copy对象的引用计数
            • 没有新的内存空间分配
        • 赋值

          • MutableArray

            • copy

              • Array

                • 面上看着是可变数组,进行增删则会异常
          • Array

            • copy

              • Array

                • 面上看着是可变数组,进行增删则会异常
      • 深拷贝

        • 和浅copy相反

          • copy对象和源对象的指针指向两片内容相同的内存空间

          • 结论:

            • 不增加被copy对象的引用计数
            • 产生了新的内存空间分配
      • 区别与联系

        • 特点

          • 是否开辟新的内存空间
          • 是否改变源对象的引用计数
        • 总结:

          • 可变对象的copy/mutableCopy都是深拷贝

          • 不可变对象

            • copy[浅拷贝]
            • mutableCopy【深拷贝】
          • copy方法返回的都是不可变对象

        • 源对象类型

          • copy方式

            • copy对象类型

              • copy类型[深/浅]
        • 可变对象

          • copy

            • 不可变

              • 深拷贝
        • 可变对象

          • mutableCopy

            • 可变

              • 深拷贝
        • 不可变对象

          • copy

            • 不可变

              • 浅拷贝
        • 不可变对象

          • mutableCopy

            • 可变

              • 深拷贝

IB拖线的时候为什么要设置为weak设置为strong行不行?

1、UIViewController的View属性是Strong[强拥有关系]

2、添加其他试图到View上通过IBOutlet方式

3、由View拥有它们【这里问的使用Weak还是Strong修饰】切入

Weak

  • 当控件的父视图和想拥有相同的生命周期则使用
  • 推荐Weak,因为MRC下系统会自动帮你管理内存

Strong

  • 当控件的父视图销毁时、还想继续拥有这个控件就使用

UIView和UILayer的关系?

UIView

  • 负责处理事件(触摸)
  • 参与响应链
  • 为其提供内容

联系

  • 每个UIView内部都有一个CALayer与之对应

  • View的尺寸和样式都有Layer提供

  • 两者都有树状结构

    • subViews

    • subLayers【较之View多了个AnchorPoint】

      • presentLayer tree动画树

        • iOS在做动画的时候,修改的属性值就是其中的属性值
      • modelLayer tree模型树

        • 最终展示在界面上
      • render tree渲染树

  • 控件想要重新绘制

    • [UIView setNeedDispaly]

      • CALayer setNeedDisplay] [同名方法]

        • [CALayer dispaly]

          • 代理响应

            • 异步绘制入口
          • 代理不响应

            • 系统绘制流程
      • 此时并未真正的绘制,需要当前RunLoop结束

CALayer

  • 负责显示内容
  • 修改属性,支持隐式动画

结束

XMind - Trial Version

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值