iOS forin和enumerateObjectsUsingBlock的最大不同

最近在做照片缓存, 突然发现了for in 和 enumerateObjectsUsingBlock的最大区别并不是速度问题, 而是这句话
Values allocated within the block will be deallocated after the block is executed. Use retain to explicitly maintain those values.
for in: 使用for in 不用说500张照片, 100张照片内存就炸掉了, 推测原因, 可能是因为for in 中用于遍历数组的方法,从开始到执行完毕才算一个完整的过程(换句话说就是从开始到执行完成才会释放内存). 所以在读取这么多照片的时候,内存一定在连续增长, 达到200M+ 就会因为内存警告⚠️而被终止. 现在随着手机不断发展, 拍摄的照片也是越来越接近单反的水平. 玩过单反的都知道, 一张照片的大小一般都在2M以上. 连续读取500张就是 1G的内存, iPhone的APP内存使用超过300就会直接被shutdown....扯远了;
enumerateObjectsUsingBlock:: 在做大量照片缓存的时候, 遍历过程中, 内存几乎不会太大变化, 可以用内存检测工具查看. 推测原因, 可能是因为每一次遍历的过程都属于一个单独的block块, 每次遍历的过程都独立存在, 如果不做retain处理, block块中的临时变量都会被释放掉. 所以, 内存并不会连续增长.
可见在项目中使用遍历数组的方法还是优先考虑enumerateObjectsUsingBlock:

推荐阅读更多精彩内容

  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 22,203评论 40 457
  • __block和__weak修饰符的区别其实是挺明显的:1.__block不管是ARC还是MRC模式下都可以使用,...
    LZM轮回阅读 1,845评论 0 4
  • 1.OC里用到集合类是什么? 基本类型为:NSArray,NSSet以及NSDictionary 可变类型为:NS...
    轻皱眉头浅忧思阅读 653评论 0 2
  • Activity 是 Android 的四大组件之一,在 Android 系统中是通过栈的方式对多个 Activi...
    rawer阅读 150评论 0 2
  • 1.取得属性每个元素都有一或多个特性,这些特性的用途是给出相应元素或其内容的附加信息。 HTMLElement也会...
    想个名字真难ing阅读 47评论 0 0