2013-07-31 5 views
3

ARC가 아닌 세계에서 올바른 방법과 이유를 알려주십시오.CFStringRef를 수동으로 해제해야합니까?

+ (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; 
} 
+0

대신 NSUUID를 사용하는 것이 좋습니다. –

+0

@Catfish_Man 나는 당신의 방식을 좋아하지만 문제는 NSUUID가 iOS 6의 Foundation에 추가되었다는 것입니다. 내 앱 타겟은 5.0입니다. 그래서 CFUUIDRef해야합니다. – AAV

답변

5

다른 답변은 수동 보유 계산에 적합합니다. 감각에 올 때 ^) ARC로 전환하면 autorelease을 보낼 수 없습니다. 대신, ARC에서, 이런 식 수행

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

CFBridgingRelease은 +1이 CFUUIDCreateString에 의해 반환 된 수를 유지 균형의 목적을 위해 CFRelease에 해당을뿐만 아니라, ARC 소요 아직도 유효한 참조를 반환 방출의 배려.

+1

ARC (또는 실제로는 ARC가 아닌)에서는 다음과 같이합니다. + (NSString *) UUID {return [[NSUUID UUID] UUIDString]; } –

+0

@Catfish_Man 나는 당신의 방식을 좋아하지만 문제는 NSUUID가 iOS 6의 Foundation에 추가되었다는 것입니다. 내 앱 타겟은 5.0입니다. 그래서 CFUUIDRef해야합니다. – AAV

+0

이것이 ARC가 아닌 질문이라고 생각했습니다. 여전히 ARC 외부에서 유효합니까? –

5

CFStrings 출시 할 필요가 없습니다. CFString은 NSString과 함께 toll-free bridged이므로 첫 번째 방법은 정확합니다. 따라서 NSString과 같이 자동으로 자동 변환 될 수 있습니다.

2

메서드는 자동 렌더링 된 개체를 반환해야 클라이언트가 개체에 대한 소유권을 얻을 수 있으며 반환 값을 무시하면 누출되지 않습니다.

1 번이 올바른 방법입니다. CFString가 만들어지고, +1이 유지되며, 자동 수거되어 클라이언트에 반환됩니다. NSString으로 캐스트해도 보유 수에 영향을주지 않습니다.

두 번째 방법에서는 CFString이 생성되고 +1은 유지되지만 릴리스 또는 자동 릴리스와 절대로 균형을 유지하지 않습니다.

+1

@Inafziger 나는 일반적으로 동의하지만,이 포스트는 올바른 "+1"표기법 (= 보유 횟수가 "너무 많음"보유로 인해 불균형합니다)을 사용하고 있습니다. – borrrden

+0

"reference count"라고 부릅니다. –

+0

@lnafziger +1과 함께 델타를 나타냅니다. –