一句话笔记,某段时间内遇到或看到的某个可记录的点。 2016-7-29
- 重写prepareForReuse 方法
- 用到左手法则(if 少嵌套原则时),一定注意位置
- 尽量不要在 block 中内使用成员变量
- 断言的使用
1、重写prepareForReuse 方法
- (void)prepareForReuse {
[self.contentImageView yy_cancelCurrentImageRequest];
self.contentImageView.image = nil;
self.priceLabel.alpha = 1.0;
}
当UITableView决定要重用Cell的时候,也就是通过dequeueReusableCellWithIdentifier方法后,它会调用Cell的prepareForReuse方法。所以在Cell中重写这个方法是为了重复使用时不会重置的属性,我们需要去手动改变它。改变像"alpha、editing、selection state"这些可自行改变的。
For performance reasons, you should only reset attributes of the cell that are not related to content,
for example, alpha, editing, and selection state.
The table view'��s delegate in tableView:cellForRowAtIndexPath:
should always reset all content when reusing a cell.
特别是,不可见的ImageView加载图片的必要性大大降低,取消其加载任务可以加速其他图片的加载,也有助于减少资源占用。特别是在可以reuse的view中,一定要记得在prepareForReuse中取消掉当前imageView的图片加载。否则之前的加载任务,还会影响到当前reuse以前视图的imageView.
2、在修改人代码时,用到左手法则(if 少嵌套原则时),一定注意位置
if () return
记住相关联的代码块一定放在一起,特别同一个方法中还有其他要处理的事件后。
3、尽量不要在 block 中内使用成员变量
@weakify(self)
[self.viewModel requestNetwork:nil completion:^(id obj) {
@strongify(self)
_userId = [obj integerValue];
} failure:^(id obj) {
// Do Failed
}];
首先需要确认的是
_userId
也是被强引用的,其次很多时候,如果直接用成员变量的时候会报警告的,但有时候又不会的。一般的情况下这样是没有什么问题的,但是实际上有时有可能会造成循环引用的, 但像下面这样使用又不会。
@weakify(self)
[self.viewModel requestNetwork:nil completion:^(id obj) {
@strongify(self)
self.userId = [obj integerValue];
} failure:^(id obj) {
// Do Failed
}];
我的理解是这样的,本身成员变量就是被强引用的,到blcok里面的话,就算使用@weakify(self)
,但是实际上没有对其弱引用掉,没有把环打破,所以依然存在问题。所以总的来说,尽量不要直接在在blcok 中使用成员变量。
4、断言的使用
经常在看一些第三方库的代码时,都会看到用到断言。所以在此总结一下Objective-C中关于断言的一些问题。
NSAssert / NSCAssert
NSParameterAssert / NSCParameterAssert
- 首先需要知道的是,我们在OC中用
NSAssert / NSParameterAssert
就OK了,另外两者是是运用于C中的上下文中。 - NSParameterAssert 用来处理参数化的断言,NSAssert 用来处理一般情况的断言
NSAssert
#define NSAssert(condition, desc, ...)
第一个参数是判断条件,如果为假,则抛出异常,显示出第二个参数描述的信息。
NSAssert(self.count>1,@"views to distribute need to bigger than one");
PS注意点: 小心使用NSAssert,看它的定义中我们会发现里面出现了一个self, 很有可能在我们使用block的时候,发现我们明明没有self的strong引用,但是仍然出现了循环引用。此时,就可以看看我们是否使用了NSAssert,毕竟这里面持有了self之后,那么很有可能就会出现引用不释放的问题。 参考:NSAssert NSCAssert NSParameterAssert
NSParameterAssert
#define NSParameterAssert(condition)
只需要一个参数,如果参数存在程序继续运行,如果参数为空,则程序停止打印日志
NSParameterAssert(name);
程序在相应位置设定的条件不满足的时候抛出来,用NSParameterAssert让程序crash到相应位置。
总的说来,断言的使用是很简单的,但真的很实用,在我们处理异常的时候,不仅能够帮助我们很快定位到错误位置,同时也不断提醒我们需要更严谨。