2014-09-28 4 views
0

CFNumber를 예제로 사용하기 때문에 어떤 유형이든 무료 펀드가 없습니다. 카운트가 2입니다 매우 이상하다하지만 CFNumberRef를 사용하는 경우, 카운트가 그것은하지 않는 arc 보인다 1입니다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; 
} 

:

난 그냥 이런 몇 가지 테스트 코드를 작성 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; 

다음 :

나는 dealloc 방법을 공개하지 않는 경우에는 메모리 누수가 없습니다
self.number = CFNumberCreate(kCFAllocatorDefault, kCFNumberDoubleType, &myDouble); 

? 어쩌면 이것을 다음과 같이 사용해야합니다 :

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

Apple이 이에 대해 언급합니까?

+0

'NSNumber'로 전송 캐스트를 연결할 수 없습니까? –

+0

@ BryanChen, 저는 CFNumber를 예제로 사용하고 있습니다. 따라서 어떤 유형이라도 Fundation 수신자 부담 전화 부분이 없어도됩니다! – Karl

+0

좋아요. 첫째,'@ autoreleasepool' 내에 retain count는 쓸모가 없습니다. 둘째, Instrument를 사용하여 메모리 누수 여부를 테스트하십시오. –

답변

0

하지 마십시오. __attribute__((NSObject))의 typedef의 사용은 권장되지 않습니다

:

애플은 the Clang documentation에 대해 할 말이 가지고있다. 이 속성을 사용하는 것이 절대적으로 필요한 경우 typedef 사용에 대해 매우 명시해야하며 __typeof 및 C++ 템플릿 인수 대체와 같은 언어 기능에 의해 보존 될 것이라고 가정하지 마십시오.

CFGetRetainCountmeaningless입니다. 무의미한 것보다 더 나쁜 것은 당신이 무언가를 의미 할 수도 있다고 생각하기 때문입니다.

+0

하지만 이렇게하지 않으면 어떻게 CoreFundation 객체를 속성으로 관리 할 수 ​​있습니까? – Karl

+0

일반적으로 당신은 setter에서 새로운 값에'CFRetain'을, 이전 값에'CFRelease'를 호출하여 메모리 관리를'assign'하고 손으로 처리합니다. 분명히 당신은'CFNumber'와 같은 가교를 위해서 그렇게해서는 안됩니다. 그냥 NSNumber를 사용해야합니다. 그러나 브리지되지 않은 CF 객체의 경우 그렇게하는 것이 좋습니다. –