我只是使用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 post說you 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);
蘋果是否會說這樣的話?
難道你不能只是橋接轉移到'NSNumber'嗎? – 2014-09-29 00:18:24
@ BryanChen,我只是使用CFNumber作爲例子,所以它可以是任何類型沒有Fundation免費部分! – Karl 2014-09-29 00:25:03
好。首先,保留計數在'@ autoreleasepool'中是無用的。其次,使用Instrument來測試它是否有內存泄漏。 – 2014-09-29 00:44:34