闭包
- 外面将强引用对象转化为弱引用指针,防止循环引用
- 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)
}
}
}
- 单例的使用个数限制,太多会浪费很多的资源
- 栈的内存分配
网友评论