對於ARC的一些理解心得

2022-08-05 05:33:19 字數 1318 閱讀 1473

我們在開發的時候都知道有arc和mrc

那麼我們現看arc是什麼:arc的全稱是automatic reference counting (arc) 是乙個編譯期的技術,利用此技術可以簡化objective-c程式設計在記憶體管理方面的工作量。

arc在xcode4.2中引入,在mac os x v10.6,v10.7 (64位應用),ios 4,ios 5中支援,xcode4.1中不支援這個技術。

我們使用的arc 其實是oc編譯器的特性,而不是執行時特性或者垃圾**機制,arc做的是在**編譯是為你自動在合適的位置插入release或者autorelease,只要沒有強指標指向物件,物件就會被釋放掉。它分為兩部分,乙個是前段編譯器,用來插入release或者retain。另乙個是優化器,因為**中可能會出現release的重複呼叫等等一些多餘的情況,這時候優化器就會自動負責移除這些多餘的指令,保證生成的**的執行質量。

這裡插入乙個對於nszone的理解和簡單介紹:arc模式中不可以呼叫nszone的方法。nszone可以簡單想象為乙個記憶體池,alloc或是dealloc這些操作,都是在這個記憶體池中操作的。預設的nszone的缺陷在於,它是全域性範圍的,時間一長,導致記憶體的碎片化,那麼效能就會受到一些影響。我們一般用到這個類一般都是在字串定義之後  有copywithzone的方法呼叫。

arc中有很多限制和規定:

不能再使用nsautoreleasepool物件,arc提供了@autoreleasepool塊來代替它,這樣更加有效率。

2.在arc環境下,使用alloc/new/copy/mutablecopy來生成/持有物件

copy/mutablecopy的使用需要copywithzone的支援,如果沒有,則不支援copy/mutablecopy

3.不能顯示呼叫[super dealloc]

4.使用@autoreleasepool塊來替代nsautorealeasepool

5.不能使用記憶體儲存區(不能再使用nszone)

6.物件變數不能作為c語言結構體的成員

7.顯示轉換id和void *

在不使用arc時,下面的轉化是正確的

id obj=[[nsobject alloc] init];

void *p=obj;

如果使用arc,上述轉換就會報錯,加__bridge轉換

id obj=[[nsobject alloc] init];

void *p=(__bridge void*)obj;

8.宣告outlet時一般應當使用weak,除了對storyboard 這樣nib中間的頂層物件要用strong

9.weak 相當於老版本的assign,strong相當於retain

對於切片的一些理解

使用技巧 type struct 乙個切片是由資料指標加上長度和容量組成的,類似與c 中的vector。var a int 等價於nil b int 表示乙個空的切片,不等於nil c int len,cap都為3的切片 d c 2 cap為3,len為2。與c共享一片記憶體位址 e c 0 2 c...

對於指標運算的一些心得總結

最近在複習第三遍c語言,c語言當中指標是個重要的知識點,對於初學c的人來說,指標往往是個頭大的板塊,之前由於應用場景不多,對於指標的認識還是很淺,然而在資料結構和簡化 方面,指標還是起到乙個非常重要的作用,下面就對指標運算做乙個小總結。指標有著指向某個目標位址的作用,p n以及p 都是對位址進行移位...

對於java 集合的一些理解

list set繼承自collection儲存引用型別 且只能乙個乙個儲存 arraylist linkedlist vector 都是繼承自list arraylist linkedlist初始化為10 擴容後為1.5倍 vector 為2倍 arraylist 底層採用的資料結構為陣列儲存元素,...