一句话笔记(03)

一句话笔记,某段时间内遇到或看到的某个可记录的点。 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                              
 }];

_block内使用成员变量

首先需要确认的是 _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到相应位置。

总的说来,断言的使用是很简单的,但真的很实用,在我们处理异常的时候,不仅能够帮助我们很快定位到错误位置,同时也不断提醒我们需要更严谨。

你可能感兴趣的:(一句话笔记(03))