為什麼我覺得 Objective-C 的內存管理比 C++ 要複雜得多?這類語言是否是趨勢?


C++ 其實是放棄了內存管理作為語言特性,而把責任推給了庫。這麼做有幾個負面的歷史遺產:

  1. 讓整整一代程序員認為 OOP 這種東西是不需要 GC 的(注意我認為 reference-counting 也是一種 GC)。
  2. 讓 value-copy 成為一種編程風格。
  3. 讓採用不同內存管理模式的人在一個項目里互相製造麻煩。一個 10 人的團隊,只要一個人某天頭腦發熱用了一個 raw pointer ,整個團隊所有的 shared_ptr 的用法就會整個失敗。

具體可看: http://techsingular.net/?p=229


objc的內存管理算簡單的


其實從原理上來說,RC這種應該是更簡單也更明了,完全遵守了誰創建(擁有)誰釋放的原則。

反觀C++則做不到:經常有對象需要在其作用域後仍舊存在,比如線程池封裝的task對象等等。

如果說趨勢的話未必,GC才是趨勢,RC或者ARC這種半自動的形式只能說是一種過渡。 (前面也有童鞋認為RC或者ARC是GC的一種...如果這麼說的話的確是趨勢)

基本可以把C++的方式 RC/ARC 和 GC三種類比為汽車的手動檔,手自一體和自動檔。

不考慮耗油方面的因素的話,自動檔必然是趨勢。


應該是移動開發的趨勢,不過ANDROID的JAVA還有垃圾收集器呢


應該是趨勢了,語言和框架的目標是提供某種機制減少開發者犯錯的機會,而不是依賴於開發者的素質。不過,我還是比較喜歡彙編、C、C++。


我的觀點是看情況了,如果一個手持的移動設備需要一個垃圾回收,那是要佔很多內存的(手機的內存很小啊)。對於一個台式機,2 - 4 GB 內存就不用考慮了。使用Objective C的iOS沒有延遲就是吧效率最高的內存管理交給了開發者。使用Java的Android會為每一個進程開一個虛擬機。延遲肯定有的。Android需要用高配置的硬體來彌補延遲。廠商的成本就增加了。Google選擇Java的原因只有一個就是就是吸引開發者。選擇Android就是選擇一個廣告終端。


恩,除非硬體底層,一般都不需要用戶自身操縱內存數據,因為會很容易就發生溢出等異常。以後的編程趨勢就是越來越容易越來越簡單。。。


arc 跟 shared_ptr/weak_ptr 不是一樣的么

當然不用 arc 就另說了


我覺得OC的內存挺簡單的,出錯概率也不大。

外部傳來的,一直要用的就retain。用一次的就不操作。

對外傳值必須使用autorelase。

自己創建對象使用,假如摸不透,可以先考慮全部使用autorelease。然後對於確定不能直接釋放的,就推遲到合適的時機release,一般是再次創建時或者dealloc。

當然現在有了ARC,聲明的時候就可以確定這些。

最後的最後,要避免引用循環,這個有點遠,就不說了。


Automatic Reference Counting 代表了趨勢


推薦閱讀:

C++局部靜態變數的內存什麼時候創建的?
C++允許「我們都是人,所以我可以把你私有的眼睛借來隨便玩,再還給你」,這難道是一種設計上的妥協?
visual studio和gdb的調試機制到底是怎麼樣的?
C++不用工具,如何檢測內存泄漏?
生物信息學需要掌握C++嗎?

TAG:編程語言 | 內存管理 | C | Objective-C | CC |