2016-04-14 102 views
3

我看過這個回答https://stackoverflow.com/a/833124/5175709和其他一些問題。從我所瞭解的情況來看,由於對象可能會擴展並且空間不足,所以我的內存位置也會發生變化。我從來不明白爲什麼我們不應該爲NSMutableDataNSMutableArray使用**,因爲它們也可以用任何add ing或append擴大並需要更多空間。爲什麼不可變對象需要雙指針?

請在我理解錯誤的地方糾正我。我很困惑。

回答

2

對象引用只需要單指針,因爲它不涉及他們管理的內存。例如,NSData類(超類的NSMutableData)可能包含以下實例變量:

(這是猜想,因爲我沒有訪問源代碼)

@interface NSData : NSObject 
{ 
    void *_data; 
    NSUInteger _length; 
} 
@end 

如果NSMutableData子想要添加到數據緩衝區,它可以在_data上執行realloc()並增加_length

指向NSMutableData對象本身的指針根本不會改變,它管理的內存對開發人員是隱藏的。

+0

謝謝,所以他們實際上使用指針指針,但我們只處理參考? – Honey

+0

@ asma22從哲學角度來說,是的,但不是在「對象**」的語言意義上。例如,取消引用'NSMutableData'指針不一定指向'_data'成員;如果'_length'出現在'_data'之前,該類將會工作得很好。 – trojanfoe

3

NSMutableArray *NSMutableData *不是直接指向包含的數據的指針。他們是東西沿着這條線更多:

struct MutableData { 
    void * data; 
    void (*appendBytes)(void * bytes); 
    // etc. 
}; 

當他們需要重新分配的擴張(或收縮),還有就是他們正在操縱一個內部指針。作爲包含實例的用戶,您不會與其交互。

相關問題