Я просто использую CFNumber в качестве примера, так что это может быть любой тип, который не имеет бесплатной бесплатной части Fundation!Правильный способ использования __ атрибута __ ((NSObject)) с ARC?
Я просто пишу некоторые тестового кода, как это:
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);
Является ли Apple что-то об этом?
Не можете ли вы просто перевести мост на «NSNumber»? –
@ BryanChen, я просто использую CFNumber в качестве примера, так что это может быть любой тип, у которого нет бесплатной бесплатной части Fundation! – Karl
Изобразительное. Во-первых, сохранить count бесполезно внутри '@ autoreleasepool'. Во-вторых, используйте Instrument для проверки наличия утечки памяти или нет. –