簡體   English   中英

相當於Objective-C的C ++ [alloc [init]]

[英]c++ equivalent in Objective-C [alloc [init]]

我說的對嗎?

NSMutableArray *foo;
foo = [[NSMutableArray alloc] init];
[foo release];

是C ++:

NSMutableArray *foo = new NSMutableArray();
delete foo;

即。 Obj-C的第二行進行動態內存分配,而第一行只是創建一個指針? 在這種情況下,[init] VS的功能是什么。 [頁頭]?

謝謝大家-我幾乎發現C ++幾乎成為學習Obj-C的障礙!

在內部,C ++可以執行類似於alloc + init的操作。 在這種情況下,alloc執行實際的內存分配(新的),而init或多或少地充當您的構造函數。

alloc等同於new()init等同於C ++對象的構造函數。

我認為最接近於Objective-C兩階段alloc / init的C ++將是調用malloc來分配緩沖區,然后使用placement new來調用先前分配的內存塊的構造函數:

void *buffer = malloc(sizeof(NSMutableCPPArray));
NSMutableCPPArray *foo = new(buffer) NSMutableCPPArray();

在此示例中,第一行對應於alloc ,為要使用的對象動態分配新的內存塊。 第二行類似於init ,調用構造函數初始化該內存塊。

當然,一個關鍵的區別是,Objective-C的alloc / init對是標准Foundation庫的基礎且廣泛使用的一部分。 相比之下,新的放置位置是C ++的一個奇特且很少使用的角落, 在線C ++ FAQ中載有警告和警告

除了已顯示的代碼的基本語義外,還必須考慮給定編程語言處理內存的方式。 在Objective-C中,每個對象都有一個保留計數,該計數在調用release時使用(並且對象在刪除前需要保留計數為0)。 在C ++中,沒有這種機制,使用new和delete(可能會導致內存泄漏)時,您必須自行處理所有內存。

如果要在Objective-C中進行內存管理,則應檢出C ++ 0x的標頭,該標頭包含shared_ptr對象(其行為更類似於Objective-C)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM