3

どちらが正しい方法で、ARC 以外の世界ではその理由を教えてください。

+ (NSString *)getUUID {
CFUUIDRef theUUID = CFUUIDCreate(NULL);
CFStringRef string = CFUUIDCreateString(NULL, theUUID);
CFRelease(theUUID);
return [(NSString*) string autorelease];
}

また

+ (NSString *)getUUID {
CFUUIDRef theUUID = CFUUIDCreate(NULL);
CFStringRef string = CFUUIDCreateString(NULL, theUUID);
CFRelease(theUUID);
return (NSString*)string;
}
4

3 に答える 3

5

他の答えは、手動保持カウントに対して正しいです。気がついたら ;^) ARC に切り替えると、送信できなくなりますautorelease。代わりに、ARC では次のようにします。

+ (NSString *)getUUID {
    CFUUIDRef theUUID = CFUUIDCreate(NULL);
    CFStringRef string = CFUUIDCreateString(NULL, theUUID);
    CFRelease(theUUID);
    return CFBridgingRelease(string);
}

Aは、 によって返される +1 の保持カウントのバランスをとる目的でCFBridgingReleasea と同等ですが、ARC が解放を処理するまだ有効な参照も返します。CFReleaseCFUUIDCreateString

于 2013-07-31T05:11:36.620 に答える
5

CFStrings は解放する必要があります。CFString はフリーダイヤルで NSString にブリッジされているため、最初の方法が正しいため、NSString のように安全に自動解放できます。

于 2013-07-31T00:45:39.883 に答える
2

メソッドは自動解放されたオブジェクトを返す必要があるため、クライアントはオブジェクトの所有権を取得する責任があり、戻り値を無視してもリークしません。

1番は正しい方法です。が作成され、CFString保持カウントが +1 され、自動解放されてクライアントに返されます。to へのキャストNSStringは保持カウントには影響しません。

2 番目の方法でCFStringは、+1 保持カウントが作成されますが、解放または自動解放とのバランスは取れません。

于 2013-07-31T00:46:05.493 に答える