5

When I return a CFDataRef by

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

There is a memory leak, how to make CFDataRef autorelease? the method [data autorelease] doesn't exit.

Michał Powaga
  • 22,561
  • 8
  • 51
  • 62
user hhh
  • 189
  • 3
  • 11

2 Answers2

8

You can't autorelease Core Foundation objects. (However, you can autorelease Core Foundation objects that support toll-free bridging such as CFDataRef; see @newacct's answer below.)

The Objective-C convention is to name your method such that it starts with the word new to indicate that the caller is responsible for releasing its return value. For example:

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

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

If you conform to this naming convention, the Xcode static analyzer will correctly flag Core Foundation memory managment issues.

titaniumdecoy
  • 18,900
  • 17
  • 96
  • 133
  • thanks ,I rename the MyFunciotn to newMyFunction,the warnings are gone! – user hhh Nov 21 '11 at 08:21
  • 1
    Not true. You *can* autorelease Core Foundation objects. https://developer.apple.com/library/ios/#documentation/General/Conceptual/CocoaEncyclopedia/Toll-FreeBridgin/Toll-FreeBridgin.html "Note from the example that the memory management functions and methods are also interchangeable—you can use CFRelease with a Cocoa object and release and autorelease with a Core Foundation object." – newacct Sep 26 '12 at 06:45
  • @newacct: That is only true for specific Core Foundation objects that support toll-free bridging. CFDataRef does support toll-free bridging, so in this particular case you are correct. – titaniumdecoy Sep 26 '12 at 18:34
3

how to make CFDataRef autorelease? the method [data autorelease] doesn't exit.

Simply cast it to an object pointer type in order to call autorelease:

-(CFDataRef)MyFunction{
    .....
    CFDataRef data = CFDataCreate(NULL, buf, bufLen);
    free(buf);
    return (CFDataRef)[(id)data autorelease];
}
newacct
  • 119,665
  • 29
  • 163
  • 224