是什麼區別可變和不可變之間有什麼區別可變和不可變
像
的NSString和的NSMutableString。
NSArray和NSMutableArray。
NSDictionary和NSMutableDictionary。
是什麼可變對象和另一對象[其中我想不可改變]
@thanks預先之間的差異。
是什麼區別可變和不可變之間有什麼區別可變和不可變
像
的NSString和的NSMutableString。
NSArray和NSMutableArray。
NSDictionary和NSMutableDictionary。
是什麼可變對象和另一對象[其中我想不可改變]
@thanks預先之間的差異。
可變對象可以突變或改變。一個不可變的對象不能。例如,雖然你可以添加或從NSMutableArray中刪除對象,但你不能用NSArray做。
可變對象可以具有更改,添加或刪除的元素,這是使用不可變對象無法實現的。不可變的對象與您在[[object alloc] initWith...]
初始值設定項中給予他們的任何輸入保持一致。
可變對象的優點是顯而易見的,但它們只能在必要時使用(這比您想象的要少得多),因爲它們佔用的內存比不可變對象多。
你可以接受一個答案,而不需要聲望點。請參閱:http://meta.stackexchange.com/questions/91889/how-do-i-accept-an-answer-to-my-questions –
FWIW,我不太確定可變對象本身使用更多的內存。我也認爲這不是他們存在的主要原因。它們的存在是因爲不可變對象可以更容易地用在多線程環境AFAIK中。 –
如果您在使用NSString的地方在應用中使用了NSMutableString,我認爲您會看到顯着的性能下降。 –
可變對象可以被改變或改變。一個不可變的對象不能。例如,雖然你可以添加或從NSMutableArray中刪除對象,但你不能用NSArray做。
感謝榮耀的黑客。我看X人電影,所以突變體可以在需要時改變那裏的行爲。在這裏,對象如何改變它的行爲,你可以給我一個例子.........對我的電影例子感到抱歉。 – user891268
可變並不意味着對象的行爲可以改變,這意味着數據可以被改變。您可以將「World」添加到包含「Hello」的NSMutableString對象,但不包含包含「Hello」的NSString對象。 – glorifiedHacker
感謝它的數據在對象中的變化而不是不可變的[Unchangeable]謝謝很多朋友。 – user891268
「mutable」的英文定義確實是您在這裏所需要的。創建後可以修改可變對象。不可變對象在創建後不能修改。這適用於您列出的所有課程。
實事求是地講,所有的可變類都是不可變者的子類,每增加自己的接口,允許對象的程序的修改,就像addObject:
,setObject:forKey:
等..
可變對象可修改的,不可變的對象不能。例如:
例如: NSMutableArray有addObject:
removeObject:
方法(和更多),但NSArray沒有。
修改字符串:
NSString *myString = @"hello";
myString = [myString stringByAppendingString:@" world"];
VS
可變對象與數組打交道時特別有用,
比如,如果你有NSMutableStrings的一個NSArray,你可以這樣做:
[myArray makeObjectsPerformSelector:@selector(appendString:) withObject:@"!!!"];
哪個會加3!到數組中每個字符串的末尾。
但如果你有NSString的(因此不可變的)的一個NSArray,你不能這樣做(至少這是一個困難得多,並且更多的代碼,比使用的NSMutableString)
可變可以改變,不可改變不可以。 當你分享一個可變對象時,你應該期望有人可以改變它。 當你分享一個不可變的對象時,你預期沒有人會改變。
還有一些其他的不同之處,有趣的是當一個不可變的對象被複制時將被保留。蘋果公司爲了性能原因還可能存在很多差異,取決於對象是否可變或不可變,例如,子字符串方法是複製其父字符串的實際字節,還是僅僅指向子字符的子範圍父母字符串,如果它是不可變的,可能不是,但誰知道。
的基本區別在於:
NSString的不能被編輯,只重新分配。這意味着當NSString的值發生變化時,它實際上指向內存中的新位置。
NSMutableString對象可以被編輯並保持相同的指針。
一個共同的實際差別是:
如果創建1的NSString,然後分配其他它,然後編輯它們中的一個,他們現在將指向不同串。
如果你對NSMutableStrings做同樣的事情,但是隻編輯其中的一個(不重新分配它),它們都會指向新編輯的對象。
大家都說你不能改變/修改不變對象。我有不同的解釋方式。你可以修改它,但你會創建一個指向新對象的指針,它不像你修改舊對象,它的一個品牌。新。目的。任何具有先前指向它的指針的指針都不會看到其更改。但是,如果它的可變對象,任何先前指向的對象將會看到它的值新的值。看例子。 FYI %p
在堆中打印指針位置。
NSString * A = @"Bob";
NSString * B = @"Bob";
NSString * C = @"Bob1";
NSString * D = A;
NSLog(@"\n %p for A \n %p for B \n %p for C \n %p for D",A,B,C,D);
// memory location of A,B,D are same.
0x104129068對於A
0x104129068對於B
0x104129088對於C
0x104129068爲d
修改指針A的對象
A = @"Bob2"; // this would create a new memory location for A, its previous memory location is still retained by B
NSLog(@"\n%p for A \n%p for B \n%p for C \n %p for D",A,B,C, D);
// A has a **new** memory location, B,D have same memory location.
0x1041290c8對於A
0x104129068對於B
0x104129088對於C
0x104129068 爲d
// NSMutableString * AA = @"Bob"; <-- you CAN'T do this you will get error: Incompatible pointer types initializing NSMutableString with an Expression of type NSString
NSMutableString * AA = [NSMutableString stringWithString:@"Bob1"];
NSString * BB = @"Bob";
NSString * CC = @"Bob1";
NSString * DD = AA;
NSLog(@"\n %p for AA \n %p for BB \n %p for CC \n %p for DD",AA,BB,CC,DD);
// memory location of AA,DD are same.
0x7ff26af14490爲AA
0x104129068爲BB
0x104129088爲CC
0x7ff26af14490爲DD
修改指針AA的對象
AA = (NSMutableString*)@"Bob3"; // This would NOT create a new memory location for A since its Mutable-- D was and still pointing to some location
NSLog(@"\n%p for AA \n%p for BB \n%p for CC \n %p for D",AA,BB,CC,DD);
// memory location of AA,DD are NOT same.
0x104129128爲AA
0x104129068爲BB
0x104129088爲CC
0x7ff26af14490爲DD
,你會想象,所有的NSString屬性的默認存儲屬性是retain
。欲瞭解更多有關copy
& retain
我強烈建議你閱讀這個問題。 NSString property: copy or retain?
一個好的後續問題將是*爲什麼NSArray,NSString,NSSet,NSDictionary等*是*不可變的。 –