2009-10-08 37 views
2

我想知道是否有可能使用C類型的NSArray/NSMuatbleArray作爲元素,即CGLayerRef?NSArray與C類型?

如果添加CGLayerRef對象到的NSMutableArray代碼編譯,但警告被拋出:

警告:傳遞的 參數1「objectForKey:」使得從 整數指針,未作鑄造

因此我的問題:如何將C類型存儲在可變數組中?

最佳,

海因裏希

回答

9

這是一個多部分的答案。最後,你的答案將是「你可以做到這一點」。

(1)NSArray無法處理一般的C類型。如果你對這種事感興趣,CFArray可以配備自定義回調來存儲其他類型的數據。警告:通常情況下,您可以將CFArray傳遞給任何採用API的NSArray - 它們被橋接。這不適用於具有自定義回調的CFArrays。 (2)CGLayerRef不是任何舊的C類型,它是一個CFType。 CFType橋接到NSObject。發送-retain-release到任何CFType的工作方式就像在NSObject上一樣。如果您要爲NSObject實施-foo的類別,然後將一些隨機的CFType轉換爲id並向其發送-foo消息,則會看到您調用foo的實現。

因此,編譯器警告這裏是唯一的問題。你可以投到(id)以避免它。所有這些都是支持的。

肯輪渡

Cocoa框架

8

看一看NSValue

一個NSValue對象爲單C或Objective-C的數據項的簡單容器。它可以包含任何標量類型,如int,float和char,以及指針,結構和對象標識符。此類的目的是允許將這些數據類型的項添加到集合中,例如NSArray和NSSet的實例,這些集合要求它們的元素是對象。 NSValue對象總是不可變的。

+0

OOOOH這是得心應手 – 2009-10-08 16:47:18

1

NSMutableArray(或任何NS容器類型)只能存儲NSObject子類的元素。不幸的是,這不包括典型的C指針類型,其中包括CGLayerRef。

的一個警告是「自由的工具 - 橋接」類,您可以從C-指針類型轉換成相應的NS-當量(例如,CFStringRef < - >NSString*),但這些橋樑都清楚地記錄和CGLayerRef似乎沒有一個。

另一件需要注意的事情是,Objective-C中的id與指針不同,因此在這兩種類型之間進行轉換以嘗試將一個C指針拉入NS容器可能會讓您陷入困境。

正如在另一個答案中提到的,您可以使用NSValue來包裝您的C指針並將NSValue存儲在您的NSMutableArray中。