2013-07-04 26 views
2

在Objective-C中,我們應該保留還是釋放Class類型的變量? A Class是一個指向C結構體的指針。調用'保留'或'釋放'在類上做什麼?

+0

在這裏的標題中可能會有一些拼寫錯誤 - 你指的是一個指向結構或實現某個點的結構的指針(如NSPoint?) – Monolo

+0

如果你將'Class'說成是在ObjC運行時中定義,那麼它是一個對象。如果不是,你能澄清嗎? –

+1

你說的時候得到的類「對象」,例如'[NSArray class]'不是一個NSObject,也不受標準的Objective-C垃圾收集協議的約束。從本質上來說,每一個對於那個特定的Objective-C類都是一個「單身」,因此永遠存在。 –

回答

11

Class被聲明爲指向struct的指針是您應該嘗試忽略的實現細節。你應該把它看作是一個不透明的類型,它引用一個表示Objective-C類的Objective-C對象。

這些Class Objective-C中的對象永遠不會被釋放。一旦創建,它們將一直存在,直到過程結束。因此,即使它們是真正的Objective-C對象,您也不需要保留和釋放它們。

至於當您將retainrelease發送到Class對象時會發生什麼具體情況:什麼都沒有。每個類對象的保留計數都有特殊值-1。當retainrelease的默認實現看到保留計數爲-1時,它們什麼也不做。

4

C結構不是Objective C對象,除非它是您保留併發布的Objective C對象的成員(例如ivar),否則不能「保留」或「釋放」結構。

當然,您需要爲堆棧分配空間,或者通過「malloc」(當您完成時不要忘記「free」)。

+0

OP可能講的是他們從調用'[obj class]'或'[Foo class]'獲得的'Class'。在GNU和Apple的實現中,儘管它是一個不透明的指向'struct Class'的指針,它們可以充當Objective-C類型,並且可以發送消息給它。一個確實可以做'[[NSObject class] release]',但正如另一個答案所說,沒有任何反應。你不應該試着「釋放()」它。 – paulotorrens