2014-09-28 19 views
0

我只是使用CFNumber作爲例子,所以它可以是任何類型沒有Fundation免費部分!在ARC中使用__attribute __((NSObject))的正確方法?

我只是寫一些測試代碼:

typedef __attribute__((NSObject)) CFNumberRef MYNumberRef; 

int main(int argc, const char * argv[]) 
{ 

    @autoreleasepool { 
    MYNumberRef ptr = NULL; 
    double myDouble = 10.1; 
    ptr = CFNumberCreate(kCFAllocatorDefault, kCFNumberDoubleType, &myDouble); 
    CFIndex count = CFGetRetainCount(ptr); 
    } 
    return 0; 
} 

這是非常奇怪的是,數是2。但是,如果我用CFNumberRef,則計數爲1看來arc不走CFType名稱約定考慮在內,它只是retain的返回值。

所以如果我使用__attribute__((NSObject))來聲明CFType屬性。 This postyou shouldn't have to explicitly nil them out in dealloc.但是,如果使用這樣的:

@property (strong, nonatomic, readwrite) __attribute__((NSObject)) CFNumberRef number; 

然後:

self.number = CFNumberCreate(kCFAllocatorDefault, kCFNumberDoubleType, &myDouble); 

還有,如果我沒有在dealloc方法釋放它沒有內存泄漏?也許我應該這樣使用它:

CFNumbeRef ref = CFNumberCreate(kCFAllocatorDefault, kCFNumberDoubleType, &myDouble); 
    self.number = ref; 
    CFRelease(ref); 

蘋果是否會說這樣的話?

+0

難道你不能只是橋接轉移到'NSNumber'嗎? – 2014-09-29 00:18:24

+0

@ BryanChen,我只是使用CFNumber作爲例子,所以它可以是任何類型沒有Fundation免費部分! – Karl 2014-09-29 00:25:03

+0

好。首先,保留計數在'@ autoreleasepool'中是無用的。其次,使用Instrument來測試它是否有內存泄漏。 – 2014-09-29 00:44:34

回答

0

不要這樣做。

蘋果確實有話要說它the Clang documentation

不推薦使用__attribute__((NSObject))類型定義。如果使用這個屬性是絕對必要的,要非常明確地使用typedef,並且不要認爲它會被諸如__typeof之類的語言特性和C++模板參數替換保留。

CFGetRetainCountmeaningless。比無意義更糟糕,因爲你認爲這可能意味着什麼。

+0

但是,如果不這樣做,我該如何管理CoreFundation對象作爲屬性? – Karl 2014-09-29 01:21:56

+0

通常你在賦值器中手動賦值allocate和處理內存管理(在新值上調用CFRetain,在舊值上調用CFRelease)。很明顯,你不應該爲像'CFNumber'這樣橋接的東西做這件事。你應該只使用'NSNumber'。但對於非橋接的CF對象,這就是你如何做到的。 – 2014-09-29 01:26:54

相關問題