Created
July 7, 2012 07:46
-
-
Save JimRoepcke/3065296 to your computer and use it in GitHub Desktop.
@synchronized doesn't retain monitored object under MRC
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
__block id foo = [MyObject new]; | |
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ | |
NSLog(@"block entering synchronized"); | |
@synchronized(foo) { | |
NSLog(@"running in synchronized"); | |
sleep(10); | |
NSLog(@"running [foo self]"); | |
[foo self]; | |
NSLog(@"ran [foo self]"); | |
} | |
NSLog(@"block exited synchronized"); | |
}); | |
sleep(1); | |
NSLog(@"running at top level, releasing foo"); | |
[foo release]; | |
NSLog(@"running at top level, released foo"); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Does this mean you should retain foo before @synchronized(foo) and release afterwards? Does that mean you need to wrap all of that in a try/catch in case it does throw so that foo can be released in that case too?