我有以下代码(在非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_ARGUMENT
添加到context
参数,但没有任何作用。
有什么想法吗?
答案 0 :(得分:2)
通过void*
传递对象并以回调方式释放它是分析器无法理解的。你可以在这些情况下让分析仪静音。
但在这种情况下,代码仍然被破坏,应该重构。您不能使用KVO的上下文将对象传递给回调:您需要上下文来标识观察。请参阅示例Dave Dribin's description of how to do KVO properly。
您不能将块设置为您添加的操作的完成块吗?