一開始看到重寫drawRect方法很耗內(nèi)存的時候,我內(nèi)心是不愿意相信的摄凡,所以我寫了
個demo驗證一下伐蒋。demo下載,請戳這里
demo很簡單犯建,就是將TestView加載到ViewController的view上面讲冠。
不重寫- (void)drawRect:(CGRect)rect
的時候內(nèi)存是這樣的
不重寫
重寫
- (void)drawRect:(CGRect)rect
之后即使什么事情都沒做,內(nèi)存是這樣的适瓦,
重寫之后
增長是非常明顯的竿开。關于增長原因就不重復了,可以參考內(nèi)存惡鬼drawRect
因為我之前有在- (void)drawRect:(CGRect)rect
給Nib傳值的習慣(這個習慣
很不好<( ̄3 ̄)>)玻熙。所以順便將View的加載時候的執(zhí)行方法回憶一下否彩。
當TestView.xib
和TestView
相關聯(lián)的時候,加載xib
的時候并不會執(zhí)行- (id)init
方法嗦随,但是會執(zhí)行下面的幾個方法
1
//當Nib文件加載進內(nèi)存的時候就會調(diào)用
- (id)initWithCoder:(NSCoder *)aDecoder
{
if (self =[super initWithCoder:aDecoder]) {
// 初始化代碼
NSLog(@"%s",__FUNCTION__);
#warning 設置屬性沒效果,因為testLabel1并沒有被初始化
self.testLabel1.text=@"99999999";
}
return self;
}
2
//當程序?qū)ib文件進行反序列化然后初始化時調(diào)用列荔。可以在此方法中對控件初始化
- (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:方法被調(diào)用了枚尼,它就會為視圖分配一個寄宿圖贴浙,會占內(nèi)存,不建議重寫
- (void)drawRect:(CGRect)rect
{
NSLog(@"%s",__FUNCTION__);
}
他們的執(zhí)行順序是這樣的:
執(zhí)行順序
結(jié)論:
因此假如想修Nib里面控件的某些屬性署恍,比如設置背景顏色崎溃,可以在- (void)awakeFromNib
中設置,如果想傳值并做一些事情盯质,可以重寫set方法袁串,在set方法中執(zhí)行。至于- (void)drawRect:(CGRect)rect
方法呼巷,要慎重使用囱修。