繁体   English   中英

当某些东西没有泄漏时,如何向 Clang static 分析仪弄清楚?

[英]How to make clear to Clang static analyzer when something's not leaking?

当使用 Clang static 分析仪分析我的 Objective-C 代码 Z1BDF605991920DB11CBDF8508204 许多泄漏让我想知道为什么它是错误的。 让我特别想知道的一个例子如下:

我有一个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 的在线分配和直接关联中PaxCompartimentOutputField 在仪器中运行此代码时,它不会泄漏。

我可以想出两种方法来解决这个问题:

  1. 使用autorelease
  2. 用以下代码替换内联分配:

(代码)

PaxCompartimentOutputField *field = [[PaxCompartimentOutputField alloc] initWithPerson:passenger];
[paxCompartiments addObject:field];
[field release];

第一个选项是过时的恕我直言(尤其是在 iOS 上,不鼓励使用它)第二个选项非常庞大 - 特别是在创建包含更多对象的数组时(比如加载默认设置的 10 个对象)。

我不想忽略 Clang 的警告,因为它是查找错误和泄漏的绝佳工具。 对于这些情况,在 Objective-C 中执行此操作的“正确”方法是什么?

那是泄漏。

由于您 alloc-init PaxCompartimentOutputField ,您拥有它并且您必须放弃它的所有权。

您有 3 个选项(您已经提到了其中的 2 个):

1) 使用便利构造函数,当一个可用时,或者在自定义 class 中,声明一个。 便利构造函数返回您不拥有的对象,通常通过向它们返回的 object 发送autorelease消息。 它看起来像这样:

[paxCompartiments addObject:[PaxCompartimentOutputField paxCompartimentOutputWithPerson:passenger]];

2)使用autorelease

[paxCompartiments addObject:[[[PaxCompartimentOutputField alloc] initWithPerson:passenger]] autorelease];

3) 使用临时变量。

PaxCompartimentOutputField *tempField = [[PaxCompartimentOutputField alloc] initWithPerson:passenger];
[paxCompartiments addObject:tempField];
[tempField release];

有一个可以与 Clang 一起使用的源注释列表。

这些可能会有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM