Clang Analyzer检测内存泄漏的机制
- 静态分析:Clang Analyzer 是一种静态分析工具,它在不实际运行代码的情况下,通过构建控制流图(CFG)来分析程序的执行路径。它会根据Objective-C 的内存管理规则,检查对象的创建、引用和释放操作是否匹配。
- 基于规则:遵循Objective-C 内存管理规则,例如:
- 当使用
alloc
、new
、copy
、mutableCopy
创建对象时,必须调用release
或autorelease
来释放内存。
- 对于通过
retain
增加对象引用计数的,也要相应地调用release
。
常见会被检测出内存泄漏风险的代码模式
- 未释放
alloc
创建的对象:
// 示例代码
void memoryLeakExample1() {
NSObject *obj = [[NSObject alloc] init];
// 没有调用 release 或 autorelease,Clang Analyzer 会检测到内存泄漏
}
retain
后未release
:
void memoryLeakExample2() {
NSObject *obj1 = [[NSObject alloc] init];
NSObject *obj2 = [obj1 retain];
[obj1 release];
// 没有对 obj2 调用 release,存在内存泄漏
}
- 循环引用导致的内存泄漏:
@interface ClassA;
@interface ClassB;
@interface ClassA {
ClassB *b;
}
@property (nonatomic, retain) ClassB *b;
@end
@interface ClassB {
ClassA *a;
}
@property (nonatomic, retain) ClassA *a;
@end
@implementation ClassA
@synthesize b;
@end
@implementation ClassB
@synthesize a;
@end
void memoryLeakExample3() {
ClassA *a = [[ClassA alloc] init];
ClassB *b = [[ClassB alloc] init];
a.b = b;
b.a = a;
[a release];
[b release];
// 由于 A 和 B 相互持有,会导致内存泄漏,Clang Analyzer 可以检测到
}