C++和Objective-C的内存管理的对比

接着上一篇关于C++内存管理的分析整理,在这里对比一下ObjectiveC的内存管理。

OC中都是使用对象的裸指针,所有对象都是继承自NSObject,NSObject提供了init release retain维护计数器,自动的计数释放对应autorelease,但是autorelease是一个pool,具体什么时候release是不确定的,如果一个方法很长即使方法没有结束,也有可能被release,也就是说autolease和作用域没有对应关系。但是把一个autorelease作为返回值传出来是没问题的。参考: https://www.cnblogs.com/chars/p/5232109.html

之前看过OC的开发文档,其中提到autorelease的具体发生时间是不定的,如果代码段不长就可以认为还没有进行实际的release,可以把对象传递或访问,这就给开发者造成了很多困惑,导致autorelease不能普遍使用,如果代码段比较长,就要手动在合适的地方release。这样就形成了autorelease和release混合使用的情况。本来autorelease是可以作为对应C++智能指针的一个机制来使用的,但是由于上述缺陷,导致autorelease比智能指针要弱化了很多。

在C++中使用智能指针可以基本解决所有内存管理的问题,当然了,有些简单的场景也没必要非得用智能指针,用std内置容器类就可以了,或者在写代码的时候小心一些就可以了。相比之下,我猜测,OC中的autorelease pool就是为了能够作为一个通用的内存管理方案提出来的,但是通过上面的分析,感觉autorelease机制是个半吊子,没有完全解决问题。结果autorelease之后,又搞了个ARC,ARC是否好用就完全依赖编译器的好坏了。

你可能感兴趣的:(软件开发,心得)