2014-04-29 42 views
2

我們正在努力使固定數組(及其所有固定組件,在幾個級別中)是可變的,似乎唯一的方法是遍歷嵌套固定數組中的所有級別並創建mutable對象使用arrayWithArraymutableCopy用於NSArray和NSMutableArray的CFType?

做了一些研究,我發現當使用CFgetCFType()函數時,NSArrayNSMutableArray都返回相同的值(int 19)。

附件是示例代碼

NSArray *array = @[@"one", @"two"]; 
NSMutableArray *mutableArray = [NSMutableArray arrayWithArray:array]; 
int id1 = CFGetTypeID((__bridge CFTypeRef)(array)); 
int id2 = CFGetTypeID((__bridge CFTypeRef)(mutableArray)); 
NSLog(@"Type: %i Type: %i", id1, id2); 

爲什麼,這兩種結構類型返回相同的CFTypeID?這是否意味着NSMutableArray的易變性隱藏在CFMutableArrayRef的不透明定義中?

回答

2

NSArray有很多非常複雜和無證的行爲。它做了一些瘋狂的事情來改善現實世界的表現。

NSArrayNSMutableArray高水平的行爲是有據可查的,但是這兩個類實際上不存在的,而不是你得到其他類的實例,其中類你實際上將取決於啓發式決策的框架將根據實際數組中的數據以及您如何訪問它。

創建數組的副本可能實際上並不創建副本,直到您開始修改它。即使如此,它可能永遠不會製作副本,它可能會保留原始數組,並保持已做出的變化量的增量。

如果您需要知道發生了什麼,那麼您根本不應該使用NSArray。相反,你應該下降到C陣列或甚至NSMutableData(小貼士:NSMutableData是真棒,當內容可能太大,不適合內存)。

您看到的特定行爲可能隨時發生變化,具體取決於操作系統版本,甚至可能是您的應用程序執行的硬件。不要依靠NSArray在實踐中的工作方式,因爲這是不可預測的。而是依賴於文檔。任何未經證明的文件都不可信,特別是NSArray這是一個特例。

此外,從來沒有子類NSArray。相反,請創建一個內部使用NSArray的包裝類。

1

我做了一些粗略的測試。它看起來像CFTypeID是相同的任何數組:大/小,靜態/運行時生成,並可變/不可變。如果我不得不猜測,我猜想NSArray/CFArrayRef集羣類組中的所有類都使用相同的CFTypeID。

沒關係。這是您無法信賴的實施細節。