物件可變性的管理和建立使用值物件,

2021-07-10 17:31:05 字數 2199 閱讀 6467

可變物件是指在建立後,可以更改其狀態的物件。您通常通過屬性或訪問方法進行更改。不可變物件是指在建立後,不可以更改其封裝狀態的物件。您從 objective-c 框架的大多數類所建立的例項是可變的,還有少數是不可變的。不可變物件具有以下好處:

 不可變物件被使用時,其值不會意外更改。

 對於許多物件而言,如果不可變,可提高其應用效能。

在 objective-c 框架中,不可變類的例項通常用來封裝離散的或緩衝的一組值,如陣列和字串。這些類通常具有可變變體,其名稱包含「mutable」。例如,有 nsstring 類(不

可變)和 nsmutablestring 類。請注意,封裝離散值的部分不可變物件(如 nsnumber 或nsdate)沒有可變類變體。 當您期望以增量方式頻繁地更改物件的內容時,應使用可變物件,而不使用不可變變體。如果從框架接收到乙個物件,其型別被定為不可變物件,請遵循該返回型別;請勿嘗試更改該物件。

值物件是指封裝了基本值(屬於 c 資料型別)且提供與該值相關的服務的物件。值物件以物件形式表示標量型別。foundation 框架向您提供了以下類(這些類產生物件,用於字串、二進位制資料、日期與時間、數字以及其他值):

 nsstring 和 nsmutablestring

 nsdata 和 nsmutabledata

 nsdate

 nsnumber

 nsvalue

值物件在 objective-c 程式設計中很重要。您會頻繁遇到這些物件,作為應用程式呼叫的方法和函式的引數和返回值。通過傳遞值物件,同一框架的不同部分以至不同的框架都可交換資料。因為值物件表示標量值,您可以在集 (collections) 中使用它們,也可以在任何需要物件的地方使用它們。但是,物件值除這些共性和由此產生的必然性之外,它們在其封裝的基本型別上還具有另一項優勢:它們讓您能採用簡單但高效的方式,對封裝的值執行某些操作。例如,nsstring 類具有用於搜尋和替換子字串、將字串寫入檔案或(首選)url 以及構建檔案系統路徑的方法。

有時,使用基本型別(即型別為 int(整型)、float 等的值)更高效、更直接。這種情況的乙個主要例子是計算數值。因此,nsnumber 和 nsvalue 物件在框架方法中,較少用作引數和返回值。但是,許多框架宣告了它們自己的數值資料型別,並將這些型別用於引數和返回值;例如 nsinteger 和 cgfloat。您應該在合適的地方使用框架定義的這些型別,因為它們有助於讓您的**不拘泥於底層平台。

使用值物件的基本知識 建立值物件的基本模式,是讓您的**或框架**從基本型別的資料建立值物件(接著也許在乙個方法引數中傳遞它)。在您的**中,稍後會從該物件訪問被封裝的資料。nsnumber 類提供了此方法的最清晰示例:

int n = 5; // value assigned to primitive type
nsnumber *numberobject = [nsnumber numberwithint:n]; // value object created from primitive
int y = [numberobject intvalue]; // encapsulated value obtained from value object
大多數「值」類同時宣告初始化程式和類工廠方法來建立例項。某些類(特別是 nsstring 和 nsdata)還提供初始化程式和類工廠方法,來根據儲存在本地或遠端檔案中的基本資料以及記憶體中的資料建立例項。這些類還提供補充方法,來將字串和二進位制資料寫入檔案或 url 指定的位置。以下示例中的**呼叫 initwithcontentsofurl: 方法,根據 url 物件定位到的檔案的內容,建立 nsdata 物件;使用資料後,**會將資料物件寫回檔案系統:

nsurl *theurl = // code that creates a file url from a string path...
nsdata *thedata = [[nsdata alloc] initwithcontentsofurl:theurl];
// use thedata...
[thedata writetourl:theurl atomically:yes];

除建立值物件和讓您訪問其封裝值之外,大多數值類都提供用於簡單操作(如物件比較)的方法。 

將值類的例項宣告為屬性時,應該使用 copy 選項。

可變性對迭代器的損害

在閱讀mit軟體構造的講義時,發現其中對可變性對迭代器的損害做出了介紹。並給出了乙個例項 如下 這裡方法的功能是刪去以 6.開頭的字串,但是發現結果與預期不同。分析 後發現好像並沒有什麼問題。自己復現一下 發現確實存在這個問題。其實,這並不是我們設計的myiterator帶來的bug。j a內建的a...

Python中對列表的可變性進行討論

在python中,一切皆物件,對於物件中的數字,字串,元組,其是不可變的物件。而對於列表是可變的物件。可變與不可變性,是對記憶體位址而言的。由於python是解釋性語言,因而對於每個物件的賦值都是對記憶體塊的引用,例如 a 2,此時a是2的引用,若這是你修改a 2的表示式,改為a 3,此時a就指向了...

Rust中的RefCell和內部可變性

refcell rust在編譯階段會進行嚴格的借用規則檢查,規則如下 即在編譯階段,當有乙個不可變值時,不能可變的借用它。如下 所示 fn main 會產生編譯錯誤 error e0596 cannot borrow immutable local variable x as mutable src...