• iOS开发日常笔记01


    为什么有initWithCoder还要awakeFromNib?

    awakeFromNib相较于initWithCoder的优势是:当awakeFromNib执行的时候,各种IBOutlet也都连接好了;而initWithCoder调用的时候,虽然子视图已经被添加到视图层级中,但是还没有引用。如果你是基于xib或storyboard创建的控件,那么你可能需要对IBOutlet连接的子控件进行初始化工作,这种情况下,你只能在awakeFromNib里进行处理。同时xib或storyboard对灵活性是有打折的,因为它们创建的代码无法被继承,所以当你选择用xib或storyboard来实现一个控件的时候,你已经不需要对灵活性有很高的要求了,唯一要做的是要保证用户一定是通过xib创建的此控件,否则可能是一个空的视图,可以在initWithFrame里放置一个断言或者异常来通知控件的用户。

    layoutSubviews作用

    layoutSubviews是对subviews重新布局。比如,我们想更新子视图的位置的时候,可以通过调用layoutSubviews方法,即可以实现对子视图重新布局。
    layoutSubviews默认是不做任何事情的,用到的时候,需要在子类进行重写。

    layoutSubviews调用场景

    ①、直接调用setLayoutSubviews。
    ②、addSubview的时候触发layoutSubviews。
    ③、当view的frame发生改变的时候触发layoutSubviews。
    ④、第一次滑动UIScrollView的时候触发layoutSubviews。
    ⑤、旋转Screen会触发父UIView上的layoutSubviews事件。
    ⑥、改变一个UIView大小的时候也会触发父UIView上的layoutSubviews事件。
    注意:
    init初始化不会触发layoutSubviews,但是使用initWithFrame进行初始化时,当rect的值不为CGRectZero时,也会触发。

    其他

    ①、- (void)layoutSubviews;
    这个方法,默认没有做任何事情,需要子类进行重写;
    ②、- (void)setNeedsLayout;
    标记为需要重新布局,异步调用layoutIfNeeded刷新布局,不立即刷新,但layoutSubviews一定会被调用;
    ③、- (void)layoutIfNeeded;

    如果,有需要刷新的标记,立即调用layoutSubviews进行布局(如果没有标记,不会调用layoutSubviews)。
    如果要立即刷新,要先调用[view setNeedsLayout],把标记设为需要布局,然后马上调用[view layoutIfNeeded],实现布局。在视图第一次显示之前,标记总是“需要刷新”的,可以直接调用[view layoutIfNeeded]
    ④、reloadData会调用layoutSubviews方法吗?
    [cell setNeedsLayout]会调用cell的layoutSubviews  reloadData只是刷新列表而已

    支付宝架构概况

    整个客户端架构总共分成四层:业务层服务层组件层框架层

      业务层:只需专注于业务逻辑与界面的实现,当需要调用如支付这样的通用能力时,研发同学直接使用下层提供的服务能力,不需自己开发,如此能够保证核心能力有收口,方便监控。

      服务层:常用模块,如登录、支付、营销等,它们不仅自己是业务,也向其他业务提供自己的服务,我们将此类模块归类到服务层。

      组件层:这一层提供的是客户端通用能力,如安全、网络、多媒体、存储这些,它们提供稳定的接口给上层使用者,同时不断优化自身内部的性能和稳定性,作为客户端的基石,它们至关重要。

      框架层:最为关键的部分,包括容器、微应用、服务框架以及 Pipeline,客户端的微应用化、启动管理都依赖框架层的运作。

    @synthesize和@dynamic

    @property有两个对应的词,一个是 @synthesize,一个是 @dynamic。如果 @synthesize和 @dynamic都没写,那么默认的就是@syntheszie var = _var;

    @synthesize 的语义是如果你没有手动实现 setter 方法和 getter 方法,那么编译器会自动为你加上这两个方法。

    @dynamic 告诉编译器:属性的 setter 与 getter 方法由用户自己实现,不自动生成。(当然对于 readonly 的属性只需提供 getter 即可)。假如一个属性被声明为 @dynamic var,然后你没有提供 @setter方法和 @getter 方法,编译的时候没问题,但是当程序运行到 instance.var = someVar,由于缺 setter 方法会导致程序崩溃;或者当运行到 someVar = var 时,由于缺 getter 方法同样会导致崩溃。编译时没问题,运行时才执行相应的方法,这就是所谓的动态绑定。

    isKindOfClass和isMemberOfClass的区别

    -(BOOL) isKindOfClass: classObj判断是否是这个类或者这个类的子类的实例

    -(BOOL) isMemberOfClass: classObj 判断是否是这个类的实例

    static关键字

    static关键字修饰局部变量:

      当static关键字修饰局部变量时,只会初始化一次且在程序中只有一份内存;

      关键字static不可以改变局部变量的作用域,但可延长局部变量的生命周期(直到程序结束才销毁)。

    static关键字修饰全局变量:

      当static关键字修饰全局变量时,作用域仅限于当前文件,外部类是不可以访问到该全局变量的(即使在外部使用extern关键字也无法访问)。

    extern关键字:

      想要访问全局变量可以使用extern关键字(全局变量定义不能有static修饰)。

    全局变量是不安全的,因为它可能会被外部修改,所以在定义全局变量时推荐使用static关键字修饰。

    控制屏幕保持常亮状态

    [UIApplication sharedApplication].idleTimerDisabled = YES;

    UITableViewCell点击时子视图背景透明的解决方法

    产生这种情况的主要原因是由于UITableViewCell的选中风格所致。如果开发者不进行设置,UITableViewCell中的selectionStyle属性默认风格为UITableViewCellSelectionStyleBlue。这时,如果用户点击或者选中了某个Cell,系统会自动将其上子视图的背景色改成透明以便统一Cell的整体背景颜色。开发者可以将其设置为UITableViewCellSelectionStyleNone枚举值来不适用任何Cell的选中风格。

    如果需要使用Cell的选中风格同时又不想让Cell上的子视图收到影响,我们可以继承UITableViewCell后在其中覆写父类的如下两个方法,在这些方法中重新设置子视图的背景色:

     

    //这个方法在Cell被选中或者被取消选中时调用 
    - (void)setSelected:(BOOL)selected animated:(BOOL)animated { 
        [super setSelected:selected animated:animated]; 
        self.testLabel.backgroundColor = [UIColor orangeColor]; 
    } 
    
     
    //这个方法在用户按住Cell时被调用 
    -(void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated{ 
        [super setHighlighted:highlighted animated:animated]; 
        self.testLabel.backgroundColor = [UIColor orangeColor]; 
    }

     

     

  • 相关阅读:
    元素的属性
    表单
    Array数组类
    string类
    js数据类型以及原型分析
    this
    有关兼容性的解决
    单位
    滚动条 和 背景位置及绝对定位
    圣杯布局 和 双飞翼布局
  • 原文地址:https://www.cnblogs.com/Lanht/p/10564835.html
Copyright © 2020-2023  润新知