我看過這個回答https://stackoverflow.com/a/833124/5175709和其他一些問題。從我所瞭解的情況來看,由於對象可能會擴展並且空間不足,所以我的內存位置也會發生變化。我從來不明白爲什麼我們不應該爲NSMutableData
或NSMutableArray
使用**
,因爲它們也可以用任何add
ing或append
擴大並需要更多空間。爲什麼不可變對象需要雙指針?
請在我理解錯誤的地方糾正我。我很困惑。
我看過這個回答https://stackoverflow.com/a/833124/5175709和其他一些問題。從我所瞭解的情況來看,由於對象可能會擴展並且空間不足,所以我的內存位置也會發生變化。我從來不明白爲什麼我們不應該爲NSMutableData
或NSMutableArray
使用**
,因爲它們也可以用任何add
ing或append
擴大並需要更多空間。爲什麼不可變對象需要雙指針?
請在我理解錯誤的地方糾正我。我很困惑。
對象引用只需要單指針,因爲它不涉及他們管理的內存。例如,NSData
類(超類的NSMutableData
)可能包含以下實例變量:
(這是猜想,因爲我沒有訪問源代碼)
@interface NSData : NSObject
{
void *_data;
NSUInteger _length;
}
@end
如果NSMutableData
子想要添加到數據緩衝區,它可以在_data
上執行realloc()
並增加_length
。
指向NSMutableData
對象本身的指針根本不會改變,它管理的內存對開發人員是隱藏的。
NSMutableArray *
和NSMutableData *
不是直接指向包含的數據的指針。他們是東西沿着這條線更多:
struct MutableData {
void * data;
void (*appendBytes)(void * bytes);
// etc.
};
當他們需要重新分配的擴張(或收縮),還有就是他們正在操縱一個內部指針。作爲包含實例的用戶,您不會與其交互。
謝謝,所以他們實際上使用指針指針,但我們只處理參考? – Honey
@ asma22從哲學角度來說,是的,但不是在「對象**」的語言意義上。例如,取消引用'NSMutableData'指針不一定指向'_data'成員;如果'_length'出現在'_data'之前,該類將會工作得很好。 – trojanfoe