большую часть времени, используя такие вещи, как CF_RETURNS_RETAINED и следуя правилу 'create', работает для меня, но я столкнулся с случаем, который мог NOT подавить.
Наконец нашел способ подавить анализатор, посмотрев исходный код llvm:
https://llvm.org/svn/llvm-project/cfe/trunk/test/ARCMT/objcmt-arc-cf-annotations.m.result
"Тест, чтобы увидеть, если мы подавляем ошибку, когда мы сохраняем указатель на
глобальный характер. "
static CGLayerRef sSuppressStaticAnalyzer;
static CGLayerRef sDmxImg[2][2][1000]; // a cache of quartz drawings.
CGLayerRef CachedDmxImg(...) // which lives for lifetime of app!
{
...
CGLayerRef img = sDmxImg[isDefault][leadingZeroes][dmxVal];
if ( !img )
{
NSRect imgRect = <some cool rectangle>;
[NSGraphicsContext saveGraphicsState];
CGContextRef ctx = (CGContextRef)[[NSGraphicsContext currentContext] graphicsPort];
CGLayerRef cgLayerRef = CGLayerCreateWithContext(ctx, imgRect.size, NULL);
CGContextRef layerCtx = CGLayerGetContext(cgLayerRef);
[NSGraphicsContext setCurrentContext: [NSGraphicsContext graphicsContextWithGraphicsPort:layerCtx flipped:YES]];
... draw some gorgeous expensive Quartz stuff ...
img = cgLayerRef;
sDmxImg[isDefault][leadingZeroes][dmxVal] = cgLayerRef;
sSuppressStaticAnalyzer = cgLayerRef; // suppress static analyzer warning!
[NSGraphicsContext restoreGraphicsState];
}
return img;
}
По какой-то причине присвоение статическому массиву не не подавляет предупреждение, но присвоение простой старой статической переменной 'sSuppressStaticAnalyzer' делает .
Кстати, вышеописанный метод - использование CGLayerRef - самый быстрый способ перерисовки кэшированных изображений (кроме OpenGL).