比方說,我有這樣的方法:傳遞一個可變對象,以不變的參數
- (void)test:(NSData *)data;
在主叫方,我有這樣的:
NSMutableData *data = [[NSMutableData alloc] initWithData:someData];
[self test:data];
測試方法裏面的數據是否成爲不可改變的?如果在測試方法內部的數據仍在處理的過程中數據在調用方面發生了變化,它會影響測試方法內部的數據嗎?
比方說,我有這樣的方法:傳遞一個可變對象,以不變的參數
- (void)test:(NSData *)data;
在主叫方,我有這樣的:
NSMutableData *data = [[NSMutableData alloc] initWithData:someData];
[self test:data];
測試方法裏面的數據是否成爲不可改變的?如果在測試方法內部的數據仍在處理的過程中數據在調用方面發生了變化,它會影響測試方法內部的數據嗎?
的OP實際上有兩個問題:
不測試方法中的數據成爲不可變的?
我同意這個問題的答案是否定的。我也同意,一個'邪惡'的實現可能會發現它是可變和改變數據。
如果數據在調用一側發生變化,而測試方法內的數據仍在處理中,它會影響測試方法內的數據嗎?
我相信這個問題的答案是是。此方法的調用者知道data
是NSMutableData
。如果test:
方法是異步的,或者調用者在調用test:
之前將data
傳遞給另一個異步方法,則可以在執行test
時更改data
。
否。如果方法是將參數data
轉換爲NSMutableData
,則可以編輯數據。如果你想確保data
是不可變的,你應該做的:
[self test:[data copy]];
號
test:
可以檢查是否[data isKindOfClass:[NSMutableData class]]
,並轉換爲一個,但是這是一個非常糟糕的主意。 test:
是廣告,它不會突變傳遞進來的對象
同意,但它不會是演員。需要製作可變的副本。 – danh
@danh,這將是一個演員。如果對象是可變的,那麼你只需要告訴編譯器它是可變的(因爲方法定義說它不是)。 – Wain