iOS 中的内存管理优化

闭包

  • 外面将强引用对象转化为弱引用指针,防止循环引用
  • block内弱引用转换成strong强引用指针,防止多线程和ARC环境下弱引用可能会被随时释放的问题
__weak MyViewController *wself = self;
self.completionHandler = ^(NSInteger result) {
    __strong __typeof(wself) sself = wself; // 强引用一次
    [sself.property removeObserver: sself forKeyPath:@"pathName"];
};

降低内存峰值

  • 延时加载,在使用的时候在进行加载,避免初次运行程序对内存的消耗
lazy var goodsImageView: UIImageView = {
        let goodsImageView = UIImageView()
        return goodsImageView
    }()
懒方法
let data = 1...3
let result = data.lazy.map {
    (i: Int) -> Int in
    print("正在处理 \(i)")
    return i * 2
}

print("准备访问结果")
for i in result {
    print("操作后结果为 \(i)")
}

print("操作完毕")

// 准备访问结果
// 正在处理 1
// 操作后结果为 2
// 正在处理 2
// 操作后结果为 4
// 正在处理 3
// 操作后结果为 6
// 操作完毕
  • 图片的读取方式
    • 如果频繁读取小文件,用它就只需要读取一次就好,自动缓存图片,但是缺点就是如果使用大图片会常驻内存,对于降低内存峰值是不利的
UIImage(named: name)
* 大图片,使用完就释放,不需要进行缓存
UIImage(contentsOfFile: path)
  • NSData & 内存映射文件
    • 第二种比第一个多一个Options,第二种方式是创建了一个内存映射文件,把内容放在虚拟内存中,只有读取操作的时候才会读到相对应页的物理内存页中,是读取大文件时适合第二种方式
public init?(contentsOfFile path: String)
public init(contentsOfFile path: String, options readOptionsMask: NSDataReadingOptions) throws
  • AutoReleasePool
    • For循环中添加autoreleasepool,这样就可以保证每次迭代完毕一次就可以释放点内存
func loadBigData() {
    for i in 1...10000 {
        autoreleasepool {
            let data = NSData.dataWithContentsOfFile(
                path, options: nil, error: nil)
        }
    }
}
  • 单例的使用个数限制,太多会浪费很多的资源
  • 栈的内存分配

你可能感兴趣的:(iOS 中的内存管理优化)