このコードで静的分析エラーが発生しましたが、これは私には意味がありません。エラーは次のとおりです。
参照カウントされたオブジェクトは、リリース後に使用されます
これは、元々C++で記述されたゲームでPNGをロードできるようにするグルーコードです。
int pngLoad(const char *filename, pngInfo *info, int format, GLuint *textureName)
{
char fullPath[Engine::Settings::MaxPath];
strcpy(fullPath, filename);
appendAppBundlePath(fullPath);
NSString *path = [NSString stringWithCString:fullPath encoding:NSUTF8StringEncoding];
NSData *data = [[NSData alloc] initWithContentsOfFile:path];
UIImage *image = [[UIImage alloc] initWithData:data];
[data release];
Texture2D *loadedTex = [Texture2D alloc];
// ##### Analyzer claims the object is released here: #####
[loadedTex initWithImage:image format:format];
int didLoad;
// ##### Error is here: #####
if (loadedTex.contentSize.width == 0 || loadedTex.contentSize.height == 0)
{
didLoad = 0;
}
else
{
didLoad = 1;
*textureName = loadedTex.name;
// return texture info
info->ScaleFactor = loadedTex.scaleFactor;
info->Width = (float)image.size.width / (float)info->ScaleFactor;
info->Height = (float)image.size.height / (float)info->ScaleFactor;
info->Alpha = 1;
info->PaddedWidth = loadedTex.pixelsWide;
info->PaddedHeight = loadedTex.pixelsHigh;
}
[loadedTex release];
[image release];
return didLoad;
}
この警告を使用するTexture2D *loadedTex = [[Texture2D alloc] retain];
と削除されますが、オブジェクトがリークしたという警告が表示されるため、ここで何かが非常に奇妙になります。
initWithImage:format:
以前はそこにあるべきではなかったものが含まれて[self release]
いましたが、この警告を見つけたときに削除しました。ただし、完全にクリーンアップして再構築した後でも、警告が表示されます。私は何か他のことを間違っていますか?XcodeのCleanコマンドで何かが適切にクリーンアップされていませんか?