一开始看到重写drawRect方法很耗内存的时候,我内心是不愿意相信的,所以我写了
个demo验证一下。demo下载,请戳这里
demo很简单,就是将TestView加载到ViewController的view上面。
不重写- (void)drawRect:(CGRect)rect
的时候内存是这样的
重写
- (void)drawRect:(CGRect)rect
之后即使什么事情都没做,内存是这样的,
重写之后
增长是非常明显的。关于增长原因就不重复了,可以参考内存恶鬼drawRect
因为我之前有在- (void)drawRect:(CGRect)rect
给Nib传值的习惯(这个习惯
很不好<( ̄3 ̄)>)。所以顺便将View的加载时候的执行方法回忆一下。
当TestView.xib
和TestView
相关联的时候,加载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
方法,要慎重使用。
网友评论