虽然ARC会帮助我们自动管理对象的引用计数,使得我们可以不用编写retain和release这样的代码,但是这个特性只对OC对象有用,而用CoreFoundation和CoreGraphic这些C函数创建的对象必须还是由我们自己来销毁,因此即使在ARC模式下也需要调用CFRelease或相对应的销毁函数来释放相对应的内存。不过有一个简单的方案,也可以使得我们不需要调用CFRelese函数,参考如下代码:
CGMutablePathRef cgPath = CGPathCreateMutable();
……
CGPathRef path = (__bridge CGPathRef)(CFBridgingRelease(cgPath));
通过上面两次的转换,我们就不需要手动调用CFRelease来释放内存了。
在这里就不得不提到CFBridgingRelease函数,它将非OC指针转换成OC对象,同时把对象生命周期交给ARC来管理,因此我们就不用手动释放内存了。
而__bridge 关键字是负责非OC指针与OC对象相互转换,但不会将对象生命周期交接过去。
因此,在我们调用到CFCreateXXX函数,或者CGCreateXXX函数的时候要注意相应处理对应的内存释放了。