Be careful with __block and autoreleased objects
I ran into an issue today that made me realize you have to be really careful when using the __block storage qualifier. Consider the following code:
__block NSString* string;
dispatch_sync(dispatch_get_main_queue(), ^{
string = [NSString stringWithString:@"I'm autoreleased!"];
});
NSLog(@"My string is: %@", string);
The main queue will cycle its autorelease pool before this dispatch_sync returns, leaving a dangling pointer in the string value. That NSLog line will definitely not do what you want, and could crash.
This is just an easy way to demonstrate this problem. You could imagine any code taking a block might have an autorelease pool in place.
I suspect that ARC handles this case better, but I've not tried. Definitely something to watch out for.
Update: Confirmed. Under ARC, __block implies strong, so you are safe in that case.
Written by Matt Massicotte
Related protips
Have a fresh tip? Share with Coderwall community!
Post
Post a tip
Best
#Ios
Authors
Sponsored by #native_company# — Learn More
#native_title#
#native_desc#