我們在view編寫的過程中,經(jīng)常的實用這三個方法,在init中初始化,在set中給view賦值,在layoutSubviews 給view布局. 這樣做的道理是init 在一個控件創(chuàng)建過程中,他上面的子view只會創(chuàng)建一次,比如:
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
UILabel *label = [[UILabel alloc] init];
[self addSubview:label];
}
return self;
}
這樣可以保證label 只創(chuàng)建一次 畢竟init 只調(diào)用一次
如果在set 和 layout的中創(chuàng)建,會因為多次調(diào)用,會不停地創(chuàng)建,同時設(shè)置屬性也是,寫到set和layout中會浪費性能,這在cell的復(fù)用中尤為明顯,
- (void)setStatus:(YYStatus *)statuses
{
UILabel *label = [[UILabel alloc] init];
[self addSubview:label];
}
這個賦值方法, 每個cell都會調(diào)用,所以label會被循環(huán)利用的cell多次創(chuàng)建,多次添加,修改屬性也會被多次修改,造成浪費,因為cell是循環(huán)利用的,不會再調(diào)用init, 所以label只會被創(chuàng)建一次,在layoutSubviews里面的道理是一樣的
Cell 針對有的控件有時候顯示,有時候不顯示(一直顯示的不用判斷hidden)
因為牽扯循環(huán)利用,cell中顯示的控件要全部創(chuàng)建,然后通過是否hidden 來判斷是否隱藏.
特別注意:cell上的每個控件都要在set賦值的時候判斷是否隱藏,包擴(kuò)view上可能顯示,也可能不顯示的子view
例如
for (int i = 0; i <photos.count; i++) {
UIImageView *imageView = [[UIImageView alloc] init];
imageView.image = ...
}
這樣判斷,如果photos.count == 5 那么剩余的四個圖片 會復(fù)用前面的圖片,因為你沒對后面的是否hidden進(jìn)行判斷
正確寫法
// 遍歷所有的圖片控件,設(shè)置圖片
for (int i = 0; i<self.subviews.count; i++) {
HWStatusPhotoView *photoView = self.subviews[i];
if (i < photosCount) { // 顯示
photoView.photo = photos[i];
photoView.hidden = NO;
} else { // 隱藏
photoView.hidden = YES;
}
}