0

我有以下代码(在非 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_ARGUMENT或参数,但没有任何效果。CF_RELEASES_ARGUMENTcontext

有任何想法吗?

4

1 回答 1

2

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

但在这种情况下,代码无论如何都被破坏了,应该重构。您不能使用 KVO 的上下文将对象传递给回调:您需要上下文来识别观察。例如,请参阅Dave Dribin 对如何正确执行 KVO 的描述

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

于 2013-09-19T19:27:26.653 回答