写真撮影のときにこの関数を使っていて、メモリが解放されてないので写真を撮るたびに使用メモリがガンガン増えていた…という話。
定義箇所を見るとこんな感じ。
CGDataProvider.h
/* The callback used by `CGDataProviderCreateWithData'. */
typedef void (*CGDataProviderReleaseDataCallback)(void *info, const void *data,
size_t size);
/* Create a direct-access data provider using `data', an array of `size'
bytes. `releaseData' is called when the data provider is freed, and is
passed `info' as its first argument. */
CG_EXTERN CGDataProviderRef CGDataProviderCreateWithData(void *info,
const void *data, size_t size, CGDataProviderReleaseDataCallback releaseData)
CG_AVAILABLE_STARTING(__MAC_10_0, __IPHONE_2_0);
第4引数のreleaseData
に解放時のコールバック関数を入れるとのこと。
そのときオマケで第1引数のinfo
まで付けてくれるらしい。
普通はdata
を解放するだけだろうけど、せっかくなのでinfo
にもなにか渡してみる。
hoge.mm
static void releaseData(void *info, const void *data, size_t size)
{
NSLog(@"%@\n", (__bridge_transfer NSString*)info);
free((unsigned char *)data);
}
hoge.mm
NSString *str = @"Data Released!";
CGDataProviderRef provider = CGDataProviderCreateWithData((__bridge_retained void*)str, buf, len, releaseData);