2014-09-28 4 views
0

Я просто использую 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 что-то об этом?

+0

Не можете ли вы просто перевести мост на «NSNumber»? –

+0

@ BryanChen, я просто использую CFNumber в качестве примера, так что это может быть любой тип, у которого нет бесплатной бесплатной части Fundation! – Karl

+0

Изобразительное. Во-первых, сохранить count бесполезно внутри '@ autoreleasepool'. Во-вторых, используйте Instrument для проверки наличия утечки памяти или нет. –

ответ

0

Не делайте этого.

Apple, действительно есть что сказать об этом в the Clang documentation:

Использование __attribute__((NSObject)) определений типов не рекомендуется. Если абсолютно необходимо использовать этот атрибут, будьте предельно явным в использовании typedef и не предполагайте, что он будет сохранен языковыми функциями, такими как __typeof и заменой аргумента шаблона C++.

CFGetRetainCount является meaningless. Хуже, чем бессмысленно, потому что вы думаете, что это может что-то значить.

+0

Но если этого не сделать, как я могу управлять объектом CoreFundation как свойством? – Karl

+0

Как правило, вы делаете его «назначать» и обрабатывать управление памятью вручную в сеттере (вызов «CFRetain» для нового значения и «CFRelease» по старому значению). Очевидно, что вы не должны делать это для чего-то, связанного с «CFNumber». Вы должны просто использовать 'NSNumber'. Но для не связанных мостов объектов CF, вот как вы это делаете. –

Смежные вопросы