Avoiding Retain Cycles with __block
-
To avoid retain cycles
-
use __weak , __block id x
__block variables are retained under ARC;
__block id x;//retains x under ARC
- manually break cycle by setting __block value to nil;
-
//arc
dispatch_block_t getfoo(int i){
return ^{
printf("%d",i);
};
}
//mrc
dispatch_block_t getfoo(int i){
return [[^{
printf("%d",i);
}copy] autorelease];
}
Casting id <--> void*(Core Foundation and toll-free bridging)
-
Bridged
NSString *a = (__bridge NSString *)my_cfref;//Noop cast CFStringRef *b = (__bridge NSString *)my_id//Noop cast
- Move CF object to ARC
NSString *c = CFBridgingRelease(my_cfref);//-1 on the CFRef - Move ARC object to CF
CFStringRef d = CFBridingRetain(my_id);// returned CFRef + 1