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

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

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

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

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

iOS 关于Nib加载时候喜欢重写drawRect的恶习_第1张图片
不重写

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

iOS 关于Nib加载时候喜欢重写drawRect的恶习_第2张图片
重写之后

增长是非常明显的。关于增长原因就不重复了,可以参考内存恶鬼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的恶习)