一句话笔记(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到相应位置。

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,107评论 19 139
  • 技术无极限,从菜鸟开始,从源码开始。 由于公司目前项目还是用OC写的项目,没有升级swift 所以暂时SDWebI...
    充满活力的早晨阅读 12,713评论 0 2
  • __block和__weak修饰符的区别其实是挺明显的:1.__block不管是ARC还是MRC模式下都可以使用,...
    LZM轮回阅读 3,407评论 0 6
  • ———————————————回答好下面的足够了---------------------------------...
    恒爱DE问候阅读 1,768评论 0 4
  • 已经忘了多久没有在看电影时认真哭过了。七月与安生,从知道这部电影获奖开始一直想看,终于在这个安静的周日下午静静的宅...
    默默然然阅读 363评论 0 1