4

このコードで静的アナライザーを実行します。

- (id) readForeignPref
{
 CFPropertyListRef matchStyle = CFPreferencesCopyAppValue(CFSTR("PBXFindMatchStyle"), CFSTR("com.apple.Xcode"));
 return [(id)matchStyle autorelease];
}

次の警告が表示されます。

関数 'CFPreferencesCopyAppValue' への呼び出しは、+1 保持カウント (所有参照) を持つ Core Foundation オブジェクトを返します。Core Foundation オブジェクトは、自動的にガベージ コレクションされません。

これは、そのような醜いもので修正する必要がある警告ですか:

- (id) readForeignPref
{
 CFPropertyListRef matchStyle = CFPreferencesCopyAppValue(CFSTR("PBXFindMatchStyle"), CFSTR("com.apple.Xcode"));
 id nsMatchStyle = [(id)matchStyle copy];
 if (matchStyle) {
  CFRelease(matchStyle);
 }
 return [nsMatchStyle autorelease];
}

それとも、コピーされたオブジェクトが無料でブリッジされていることを考えると、これは単なる誤検知ですか?

4

1 に答える 1

8

これを試して:

- (id) readForeignPref
{
      CFPropertyListRef matchStyle = CFPreferencesCopyAppValue(CFSTR("PBXFindMatchStyle"), CFSTR("com.apple.Xcode"));
      return [(id)CFMakeCollectable(matchStyle) autorelease];
}

がないとCFMakeCollectable、これは GC でリークします。これは、 aCFRetainが ObjC とは異なるため-retainです。ACFRetainはそのオブジェクトのガベージ コレクションを無効にCFMakeCollectableし、有効にする必要があります。

于 2009-09-03T14:15:56.280 に答える