美文网首页
iOS 关于Nib加载时候喜欢重写drawRect的恶习

iOS 关于Nib加载时候喜欢重写drawRect的恶习

作者: 小沫360 | 来源:发表于2016-04-06 00:06 被阅读1114次

    一开始看到重写drawRect方法很耗内存的时候,我内心是不愿意相信的,所以我写了

    个demo验证一下。demo下载,请戳这里

    demo很简单,就是将TestView加载到ViewController的view上面。

    不重写- (void)drawRect:(CGRect)rect的时候内存是这样的

    不重写
    重写- (void)drawRect:(CGRect)rect之后即使什么事情都没做,内存是这样的, 重写之后

    增长是非常明显的。关于增长原因就不重复了,可以参考内存恶鬼drawRect

    因为我之前有在- (void)drawRect:(CGRect)rect给Nib传值的习惯(这个习惯

    很不好<( ̄3 ̄)>)。所以顺便将View的加载时候的执行方法回忆一下。

    TestView.xibTestView相关联的时候,加载xib的时候并不会执行- (id)init方法,但是会执行下面的几个方法

    1

    //当Nib文件加载进内存的时候就会调用
    - (id)initWithCoder:(NSCoder *)aDecoder
    {
        if (self =[super initWithCoder:aDecoder]) {
            // 初始化代码
            
            NSLog(@"%s",__FUNCTION__);
    
        #warning 设置属性没效果,因为testLabel1并没有被初始化
        
            self.testLabel1.text=@"99999999";
        }
        return self;
    }
    
    

    2

    //当程序对Nib文件进行反序列化然后初始化时调用。可以在此方法中对控件初始化
    - (void)awakeFromNib
    {
        NSLog(@"%s",__FUNCTION__);
        
        self.testLabel1.text=@"888888888";
    }
    
    

    3

    //set方法
    - (void)setTittle:(NSString *)tittle
    {
        
        NSLog(@"%s",__FUNCTION__);
        
        _tittle=tittle;
        
        self.testLabel2.text=tittle;
    }
    
    

    4

    //如果UIView检测到-drawRect:方法被调用了,它就会为视图分配一个寄宿图,会占内存,不建议重写
    
    - (void)drawRect:(CGRect)rect
    {
        NSLog(@"%s",__FUNCTION__);
    }
    
    

    他们的执行顺序是这样的:

    执行顺序

    结论:

    因此假如想修Nib里面控件的某些属性,比如设置背景颜色,可以在- (void)awakeFromNib中设置,如果想传值并做一些事情,可以重写set方法,在set方法中执行。至于- (void)drawRect:(CGRect)rect方法,要慎重使用。

    相关文章

      网友评论

          本文标题:iOS 关于Nib加载时候喜欢重写drawRect的恶习

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