2011-11-21 5 views
2

내가 어떻게 CFDataRef 오토 릴리즈를 만들기 위해,어떻게 메모리 누수없이 CFDataRef를 반환? [IOS]

(CFDataRef)MyFunction{ 
    ..... 
    CFDataRef data = CFDataCreate(NULL, buf, bufLen); 
    free(buf); 
    return data; 
} 

메모리 누수가있는 CFDataRef으로 돌아 오면? [data autorelease] 메소드가 종료되지 않습니다.

답변

5

핵심 기반 개체를 자동 취소 할 수 없습니다. (그러나 CFDataRef 같은 수신자 부담 브리징을 지원하는 Core Foundation 객체는 자동으로 릴리즈 할 수 있습니다. 아래의 @ newacct의 답변을 참조하십시오.)

Objective-C 규칙은 단어가 new 호출자가 반환 값을 반환 할 책임이 있습니다. 예 :

+ (CFDataRef)newDataRef { 
    return CFDataCreate(...); 
} 

CFDataRef myDataRef = [self newDataRef]; 
... 
CFRelease(myDataRef); 

이 명명 규칙을 따르면 Xcode 정적 분석기가 Core Foundation 메모리 관리 문제를 올바르게 표시합니다.

+0

덕분에, 내가 newMyFunction에 MyFunciotn의 이름을 변경, 경고가 사라 졌어요! –

+0

사실이 아닙니다. Core Foundation 객체는 자동으로 릴리즈 할 수 있습니다. https://developer.apple.com/library/ios/#documentation/General/Conceptual/CocoaEncyclopedia/Toll-FreeBridgin/Toll-FreeBridgin.html "예제에서 메모리 관리 기능과 메소드는 서로 바꿔서 사용할 수 있습니다. CFRelease를 Cocoa 객체와 함께 사용하고 Core Foundation 객체를 사용하여 자동 릴리스하십시오. " – newacct

+0

@newacct : 이것은 무료 전화 브리지를 지원하는 특정 핵심 기반 개체에만 해당됩니다. CFDataRef는 수신자 부담 브리징을 지원하므로 정확한 경우입니다. – titaniumdecoy

1

CFDataRef autorelease를 만드는 방법은 무엇입니까? [data autorelease] 메서드 이 종료되지 않습니다.

간단하게이 autorelease를 호출하기 위해 객체 포인터 형식으로 캐스팅 :

-(CFDataRef)MyFunction{ 
    ..... 
    CFDataRef data = CFDataCreate(NULL, buf, bufLen); 
    free(buf); 
    return (CFDataRef)[(id)data autorelease]; 
}