obj c相關分析 3

2021-06-09 00:52:16 字數 1623 閱讀 4026

1 copy vs mutablecopy

現在需要說明一下:

只有遵守nscopying 協議的類才可以傳送copy訊息,

並且實現 copywithzone: 方法。

只有遵守 nsmutablecopying 協議的類才可以傳送mutablecopy訊息,

實現 mutablecopywithzone: 方法。

不過現在ios sdk已經有一些的型別遵守了這兩個協議,eg:

nsstring nsarray等,具體可檢視sdk doc

網上關於這兩個方法的說明都比較詳細,這裡總結一下:

1. 如果對一不可變物件複製,

copy是指標複製(淺拷貝)和mutablecopy就是物件複製(深拷貝)。

2. 如果是對可變物件複製,都是深拷貝,但是copy返回的物件是不可變的。

3. nscopyobject()他實際上是淺拷貝,所以需要你需要自己處理需要深拷貝的成員變數(指標變數),還有一點nscopyobject是物件記憶體的指標拷貝,因此原物件的retaincount也被複製過來。

4. 對於容器類物件,容器儲存的指標都是淺拷貝,所以如果需要深拷貝容器內指標所指向的物件,你需要遍歷容器中的指標,分別進行深拷貝。

5.其實copy/mutablecopy,類似於設計模式的clone模式,當你進行深clone或者淺clone,你需要做的就是過載copywithzone或者mutablecopywithzone。

2 nsautoreleasepool

在每乙個執行緒中都有乙個存放自動釋放池堆疊。當您建立乙個新的自動釋放池時,它被新增到堆疊的頂部。當自動釋放池被**時,它們從堆疊中被刪除。當乙個物件收到送autorelease訊息時,它被新增到當前執行緒的目前處於棧頂的自動釋放池中。如果您釋放了乙個不是位於堆疊頂部的自動釋放池,則這會導致堆疊中所有位於它上面的(未釋放的)自動釋放池,連同它們包含的所有物件一起被釋放。這樣就可能會造成程式奔潰。

一般自動釋放池用於下面這種情況:

2. 如果你建立了乙個新的執行緒,你必須建立自己的自動釋放池,避免記憶體洩漏。不過如果執行緒不會發起cocoa呼叫,那麼也可以不建立自動釋放池(不過這種情況基本沒遇到過)。

3. 在一些會產生大量臨時物件的地方,可以在迴圈內部建立乙個自動釋放池,以便在下次迭代之前銷毀這些物件。這可以幫助減少應用程式的最大記憶體佔用量。

nsautoreleasepool與drain , retain , release的關係(在基於引用計數的環境下(一般我們開發的環境都是這個))。

一般nsautoreleasepool時,我們都只會利用drain,其原理是drain會給自動釋放池傳送dealloc訊息,從而導致自動釋放池給它內部所有的物件發生release訊息,來清空釋放池,和**物件的記憶體。

但是如果你給乙個nsautoreleasepool發生retain訊息,就會出現異常,如果給nsautoreleasepool傳送release訊息,預設是不做任何事情。

首先給出下面說明:

這三個方法大家都最為熟悉,沒有什麼好講的,

這裡需要注意一下是:在將集合類的元素移除集合是,會元素傳送release訊息。加入時會發生retain訊息。其實去看看cocoa2d的容器**就會發現這個。

同時還需要注意迴圈引用的問題,一般的解決方法將強引用改為弱引用。

OBJ C相關分析 2

1.super 這個關鍵字在obj c的 裡很常見,安裝oop的思想就是,呼叫父類的方法。例如下面的 inte ce classa nsobject void setname nsstring name end inte ce classb classa void setnumber nsstrin...

obj c 開發相關基本名詞解釋

開發相關基本名詞解釋 補完計畫ing.rel noopener noreferrer obj c 開發相關基本名詞解釋 補完計畫ing.long gnu專案創始於1984,旨在開發乙個類似unix且為 自由軟體 自由是指權利,而不是 完整的作業系統,gnu系統。gnu的核心並沒有開發完畢,因此他使用...

R語言 相關分析和典型相關分析

r語言相關分析與典型相關分析 相關分析與典型相關分析 pearson相關係數 a c 1,3,5,7,9 b c 1,4,6,9,10 cor a,b pearson相關係數 cor.test a,b 檢驗相關係數的顯著性 cor iris 1 4 相關係數,引數填資料集,則計算相關係數矩陣 spe...