问题
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.
回答1:
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.
回答2:
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];
}
来源:https://stackoverflow.com/questions/8208917/how-to-return-cfdataref-without-memory-leakios