2014-12-04 37 views
0

我正在使用從Apple的有用UIElementUtilities應用程序中借用的Core Foundations方法。問題是我希望更新這個借用的方法,以便在Apple的新自動引用計數(ARC)系統下運行。通過在變量之前插入'__bridge'限定符,我已經取得了一些進展,但是使用下面顯示的方法,嘗試轉換爲ARC後出現以下錯誤:「error:Incompatible types cast'NSString __strong *'到'CFTypeRef *'(aka'const void **)用__bridge cast「。我該如何製作一個可接受的指向'actionDescription'緩衝區的指針,以便將其內容重新改寫爲NSString?ARC不兼容類型鑄造

+ (NSString *)descriptionOfAction:(NSString *)actionName ofUIElement:(AXUIElementRef)element { 

NSString * actionDescription = nil; 

AXUIElementCopyActionDescription(element, (__bridge CFStringRef)actionName, (__bridge CFStringRef *)&actionDescription); 

return actionDescription; 

//return [actionDescription autorelease]; 

}

回答

1

有趣的問題。

在ARC中,當您指定變量的引用時,ARC需要知道如何處理變量的前一個值。如果變量是__strong那麼舊的參考需要被釋放,如果它是__unsafe_unretained它可以丟棄舊的參考等等。所有這些都發生在大多數時間,而不需要你擔心。

當您將指針傳遞給包含引用的變量時,它會變得更復雜一點,ARC需要知道指向變量的限定符。 Objective-C使用一種稱爲的技術,通過寫回,這可能涉及使用隱藏的臨時變量來確保它們都正常工作,詳情請參閱Objective-C Automatic Reference Counting。核心基金會沒有與此相同的內容,這就是阻礙你的轉換的原因。

的解決方案是將一個指針傳遞到核心基礎類型的變量,然後轉移到Objective-C和ARC的呼叫後的功能:

+ (NSString *)descriptionOfAction:(NSString *)actionName ofUIElement:(AXUIElementRef)element 
{ 
    CFStringRef actionDescription = nil; 

    AXUIElementCopyActionDescription(element, (__bridge CFStringRef)actionName, &actionDescription); 

    return (__bridge_transfer NSString *)actionDescription; 
} 

使用注意事項的__bridge_transfer - 的Copy在函數名稱指示返回的CFStringRef由調用者擁有,必須在使用後釋放,__bridge_transfer將該所有權交給ARC,然後由ARC負責釋放引用。

HTH

+0

感謝您的解決方案和解釋,但很明顯,我是在我的頭上。 – Antony 2014-12-06 16:04:13