2

私は静的アナライザは、このケースではおそらく正しいと確信しているが、なぜ私はかなり理解していない...ここで Xcode AnalyzerはARCでリークを報告しています - 解決方法に関するアドバイス?

はUUIDクラスからのコードのセグメントです:

@interface UUID { 
    CFUUIDRef uuidRef; 
} 
@end 

@implementation UUID 

- (id) initWithString:(NSString*)string { 
    if (string && [NSNull null] != (NSNull*)string) 
     return [self initWithCFUUID:CFUUIDCreateFromString(kCFAllocatorDefault, (__bridge CFStringRef) string)]; 
    else 
     return nil; 
} 

- (id) initWithCFUUID:(CFUUIDRef)uuidRef { 
    if (self = [super init]) { 
     self->uuid = uuidRef; 
    } 
    return self; 
} 
@end 

のXcodeが持っています最初のinitの 'return'行で漏れが報告されました。スクリーンショットはhereです。

私はbridge、bridge_retain、およびbridge_transferの基本的な理解を持っていますが、私はこの場合ブリッジが正しい選択であると信じています。

私の理解が正しい場合、私はこれを間違って実行しているかどうかについて誰にでも助言できますか?また、これを解決するにはどうすればいいですか?

よろしく、 ニック

答えて

1

あなたの実装にdeallocを追加し、そこuuidRefにCFReleaseを呼び出す必要があります:

- (void)dealloc 
{ 
    CFRelease(uuidRef); 
} 
+0

私はこのことを理解していないんです。 CFUUIDCreateFromString()関数が保持カウント+1のオブジェクトを返す場合、確実に解放すると解放されます。これをコードに追加すると、予想通りにクラッシュします...? –

+1

'UUID'クラスでは、' -initWithCFUUID: 'メソッドは' CFUUIDRef'を保持する必要があります。また、 '-dealloc'をオーバーライドし、そこで' CFUUIDRef'を解放する必要があります。これは単なる基本的な保持/解放の規約です。 –

+0

@dark_perfect 'UUID'オブジェクトを' initWithCFUUID'に渡して、そのオブジェクトをどのように保っていたかには注意を払っていませんでした。 'self-> uuid = uuidRef;'行は、おそらく 'self-> uuidRef = uuidRef;'でなければなりません。インターフェースの宣言が正しいと仮定して( 'uuid'メンバーはありません)。私は答えを何かに置き換えました。 – dasblinkenlight

関連する問題