objective c - Proper memory management with CFStringRef and CFRelease -
consider simple method; it's category on nsstring.
- (nsstring *)stringbyurlencoding { cfstringref newstring = cfurlcreatestringbyaddingpercentescapes(null, (cfstringref)self, null, (cfstringref)@"!*'\"();:@&=+$,/?%#[]% ", kcfstringencodingutf8); nsstring *returnstring = (__bridge nsstring *)newstring; cfrelease(newstring); homecoming returnstring; } its job turn = %3d, etc. url encoding, that's not relevant question.
a few questions memory management:
after cfrelease(newstring); called, can still po newstring in debugger , see string. mean it's not getting deallocated properly?
when pass casted cfstringrefs arguments of cfurlcreatestringbyaddingpercentescapes, (like (cfstringref)self, example) believe not need store variable , cfrelease them due "toll-free bridging". correct?
does reply #2 alter if it's cgimageref, not cfstringref? why cgimageref have own cgimagerelease function, there's no cfstringrelease method?
to create sure understanding of __bridge_transfer correct, modified code identical?
- (nsstring *)stringbyurlencoding { cfstringref newstring = cfurlcreatestringbyaddingpercentescapes(null, (cfstringref)self, null, (cfstringref)@"!*'\"();:@&=+$,/?%#[]% ", kcfstringencodingutf8); nsstring *returnstring = (__bridge_transfer nsstring *)newstring; // cfrelease(newstring); homecoming returnstring; }
as questions:
1) don't have plenty info know if newstring should have been deallocated. instance, if no character replacement needed, reasonable cfurlcreatestringbyaddingpercentescapes homecoming equivalent of [self retain]; 1 example. broader point "you can't know." normal approach here utilize instruments heap growth , leaks. more information, google "retaincount useless" (i won't rehash here.)
2) yes.
3) cgimageref not toll-free bridged, however, understand it, cfretain , cfrelease should work. difference between cfrelease , cgimagerelease here parameter cfrelease must not null, whereas cgimagerelease tolerate null parameters.
4) __bridge_transfer appropriate annotation utilize here. "transfers" +1 retain count side arc doesn't handle side handle. set differently, __bridge_transfer tells arc need create release phone call pointer, through never generated retain.
objective-c automatic-ref-counting core-foundation
No comments:
Post a Comment