【问题标题】:Clang static analyzer warns about consumed blockClang 静态分析器警告消耗块
【发布时间】:2013-09-19 18:57:53
【问题描述】:

我有以下代码(在非 ARC 项目中):

- (void)loadWithCompleteBlock:(void (^)(void))complete
{    
    ...
    complete = [complete copy];
    ...            
    [[NSOperationQueue mainQueue] addObserver:self forKeyPath:@"operationCount" options:0 context:complete];
}

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *) context
{
    void (^complete)(void) = context;
    [self performSelectorInBackground:@selector(loadFilesWithCompleteBlock:) withObject:complete];
    [complete release];
}

静态分析器给出警告Potential leak of an object stored into 'complete'

我厌倦了将NS_RELEASES_ARGUMENTCF_RELEASES_ARGUMENT 添加到context 参数,但没有任何效果。

有什么想法吗?

【问题讨论】:

    标签: ios objective-c clang key-value-observing clang-static-analyzer


    【解决方案1】:

    通过void* 传递对象并在回调方法中释放它是分析器无法理解的。对于这些情况,您可以让分析器静音。

    但在这种情况下,代码无论如何都被破坏了,应该重构。您不能使用 KVO 的上下文将对象传递给回调:您需要上下文来识别观察。参见例如Dave Dribin's description of how to do KVO properly

    你不能将块设置为你添加的操作的完成块吗?

    【讨论】:

    • 为什么我的代码被破坏了?它有效...如何使分析仪静音?我在队列上有多项操作,想知道所有操作何时完成。但我不想用waitUntilAllOperationsAreFinished之类的东西阻塞当前线程。
    • @Alexander “它有效”是糟糕代码的一个非常糟糕的借口。正如我所说,您滥用 KVO 上下文的方式会导致麻烦,您应该采用另一种模式。例如,您可以将块设置为拥有队列的类上的实例变量。
    • 这里很好地解释了上下文的用途:stackoverflow.com/a/11917449/393863
    猜你喜欢
    • 2023-03-20
    • 2011-06-24
    • 1970-01-01
    • 2012-12-13
    • 2013-01-21
    • 1970-01-01
    • 1970-01-01
    • 2010-12-24
    • 1970-01-01
    相关资源
    最近更新 更多