目录
内存泄露
一、Leaked Memory:
未被程序引用,但也无法释放的内存。
1、在MRC下比较常见,在ARC下由于有自动引用计数,在编译时会自动添加release,所以比较少见。
2、但在ARC机制下,使用CF或CG对象时,忘记手动调用CFRelease或CGRelease会出现。
3、手动开辟了堆空间,而没有手动释放也会出现。
二、Abandoned Memory:
被程序引用,无用但也无法释放的内存。
主要是循环引用
1、block的循环引用。
2、delegate使用strong造成的循环引用。
3、定时器传入target,没有调用invalid造成的循环引用。
4、两个对象互相持有造成的循环引用。
Leaks的使用
Leaks只能检测 leaks memory类型的内存泄露,而不能检测到循环引用。
- (void)createLeakedMemory {
// 使用 malloc 动态分配内存
char *leakedMemory = malloc(1024 * 1024); // 分配 1MB 的内存
// 模拟使用这块内存
strcpy(leakedMemory, "This is a memory leak example.");
// 忘记释放内存,导致泄露
// free(buffer); 应该调用,但这里没有
}
func createLeakedMemory() {
let pointer = UnsafeMutablePointer<Int>.allocate(capacity: 1024*1024) // 分配内存
// 没有调用 pointer.deallocate(),导致内存泄露
//pointer.deallocate() 应该调用,但这里没有
}
提示:上述代码在模拟器演示,使用leaks工具可以捕获到内存泄露,真机不行。调用堆栈有时也并不能正常显示(dwarf with dsym file已经打开)
No stack trace is availabel for this leak; it may have been allocated before the allocations instrument was attached
此泄漏没有可用的堆栈跟踪;它可能是在附加分配文书之前分配的
行者常至,为者常成!