当使用 Clang 静态分析器分析我的 iOS 目标 C 代码时,我得到了很多“潜在的泄漏”。许多泄漏让我想知道为什么它是错误的。让我特别想知道的一个例子如下:
我有一个 type 的类变量NSDictionary
,用于存储一些设置。现在,当我有一种方法可以更改字典中的内容时:
- (void) loadPassengerCompartiments {
NSMutableArray *paxCompartiments = [self.outputTable objectAtIndex:2];
NSArray *paxCompSrc = [self.values objectForKey:@"PassengerCompartiments"];
for(MassPerson *passenger in paxCompSrc) {
=> [paxCompartiments addObject:[[PaxCompartimentOutputField alloc] initWithPerson:passenger]];
}
}
Clang 在PaxCompartimentOutputField
. 在仪器中运行此代码时,它不会泄漏。
我可以想出两种方法来解决这个问题:
- 利用
autorelease
- 用以下代码替换内联分配:
(代码)
PaxCompartimentOutputField *field = [[PaxCompartimentOutputField alloc] initWithPerson:passenger];
[paxCompartiments addObject:field];
[field release];
第一个选项是过时的恕我直言(尤其是在 iOS 上不鼓励使用它)第二个选项非常庞大 - 特别是在创建包含更多对象的数组时(比如 10 个加载默认设置的对象)。
我不想忽略 Clang 的警告,因为它是查找错误和泄漏的绝佳工具。对于这些情况,在 Objective-C 中执行此操作的“正确”方法是什么?