NSArray *emailArray = (__bridge NSArray *)ABMultiValueCopyArrayOfAllValues(emailProperty);
// 警告:Potential leak of object emailArray
ABMultiValueCopyArrayOfAllValues 為 **Core Foundation 風格創建函數**(名稱含 Copy),遵循 **Create Rule**:調用者擁有對象,**需手動釋放**(CFRelease)。__bridge 僅轉換指針,**不轉移所有權**,ARC 不會自動插入 release,導致洩漏。
NSArray *emailArray = (__bridge_transfer NSArray *)ABMultiValueCopyArrayOfAllValues(emailProperty);
// __bridge_transfer 告訴編譯器:所有權轉移給 ARC,ARC 會在變量超出作用域時自動 release
| 關鍵字 | 方向 | 適用場景 |
|---|---|---|
__bridge | 雙向轉換,不轉移所有權 | 臨時傳遞給 CF 函數,雙方不持有 |
__bridge_retained | OC → CF,保留所有權(調用者需 CFRelease) | 將 OC 對象長期存入 CF 容器 |
__bridge_transfer | CF → OC,轉移所有權給 ARC | CF Create/Copy/Retain 函數返回值賦給 OC 變量 |
CFStringCreateWithFormatCGImageCreateWithImageInRectABAddressBookCreateWithOptionsSecCertificateCopyDataCreate、Copy、Retain 的 C 函數
CFErrorRef error = nil;
ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(nil, &error);
if (addressBook) {
// __bridge_transfer 接管所有權
NSArray *allPeople = (__bridge_transfer NSArray *)ABAddressBookCopyArrayOfAllPeople(addressBook);
// 使用 allPeople...
// 作用域結束時 ARC 自動 CFRelease(addressBook) 與 allPeople
} else {
NSLog(@"AddressBook create failed: %@", (__bridge_transfer NSError *)error);
}
遇到 Potential leak 警告且來源為 CF Create/Copy 函數,將 __bridge 改為 __bridge_transfer 即可修復。記住:**Create Rule 返回值必須轉移給 ARC 或手動 CFRelease**。