MST

星途 面试题库

面试题:Objective-C中Clang Analyzer如何检测内存泄漏

请描述在Objective-C代码中,Clang Analyzer是通过什么机制来检测可能存在的内存泄漏情况,并举例说明一些常见的会被Clang Analyzer检测出内存泄漏风险的代码模式。
49.1万 热度难度
编程语言Objective-C

知识考点

AI 面试

面试题答案

一键面试

Clang Analyzer检测内存泄漏的机制

  1. 静态分析:Clang Analyzer 是一种静态分析工具,它在不实际运行代码的情况下,通过构建控制流图(CFG)来分析程序的执行路径。它会根据Objective-C 的内存管理规则,检查对象的创建、引用和释放操作是否匹配。
  2. 基于规则:遵循Objective-C 内存管理规则,例如:
    • 当使用allocnewcopymutableCopy创建对象时,必须调用releaseautorelease来释放内存。
    • 对于通过retain增加对象引用计数的,也要相应地调用release

常见会被检测出内存泄漏风险的代码模式

  1. 未释放alloc创建的对象
// 示例代码
void memoryLeakExample1() {
    NSObject *obj = [[NSObject alloc] init];
    // 没有调用 release 或 autorelease,Clang Analyzer 会检测到内存泄漏
}
  1. retain后未release
void memoryLeakExample2() {
    NSObject *obj1 = [[NSObject alloc] init];
    NSObject *obj2 = [obj1 retain];
    [obj1 release];
    // 没有对 obj2 调用 release,存在内存泄漏
}
  1. 循环引用导致的内存泄漏
@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 可以检测到
}