2011-08-15 41 views
13

是什麼區別可變和不可變之間有什麼區別可變和不可變

的NSString和的NSMutableString。

NSArray和NSMutableArray。

NSDictionary和NSMutableDictionary。

是什麼可變對象和另一對象[其中我想不可改變]

@thanks預先之間的差異。

+1

一個好的後續問題將是*爲什麼NSArray,NSString,NSSet,NSDictionary等*是*不可變的。 –

回答

16

可變對象可以突變或改變。一個不可變的對象不能。例如,雖然你可以添加或從NSMutableArray中刪除對象,但你不能用NSArray做。

可變對象可以具有更改,添加或刪除的元素,這是使用不可變對象無法實現的。不可變的對象與您在[[object alloc] initWith...]初始值設定項中給予他們的任何輸入保持一致。

可變對象的優點是顯而易見的,但它們只能在必要時使用(這比您想象的要少得多),因爲它們佔用的內存比不可變對象多。

+1

你可以接受一個答案,而不需要聲望點。請參閱:http://meta.stackexchange.com/questions/91889/how-do-i-accept-an-answer-to-my-questions –

+0

FWIW,我不太確定可變對象本身使用更多的內存。我也認爲這不是他們存在的主要原因。它們的存在是因爲不可變對象可以更容易地用在多線程環境AFAIK中。 –

+0

如果您在使用NSString的地方在應用中使用了NSMutableString,我認爲您會看到顯着的性能下降。 –

5

可變對象可以被改變或改變。一個不可變的對象不能。例如,雖然你可以添加或從NSMutableArray中刪除對象,但你不能用NSArray做。

+0

感謝榮耀的黑客。我看X人電影,所以突變體可以在需要時改變那裏的行爲。在這裏,對象如何改變它的行爲,你可以給我一個例子.........對我的電影例子感到抱歉。 – user891268

+0

可變並不意味着對象的行爲可以改變,這意味着數據可以被改變。您可以將「World」添加到包含「Hello」的NSMutableString對象,但不包含包含「Hello」的NSString對象。 – glorifiedHacker

+0

感謝它的數據在對象中的變化而不是不可變的[Unchangeable]謝謝很多朋友。 – user891268

2

mutable」的英文定義確實是您在這裏所需要的。創建後可以修改可變對象。不可變對象在創建後不能修改。這適用於您列出的所有課程。

實事求是地講,所有的可變類都是不可變者的子類,每增加自己的接口,允許對象的程序的修改,就像addObject:setObject:forKey:等..

8

可變對象可修改的,不可變的對象不能。例如:

例如: NSMutableArray有addObject:removeObject:方法(和更多),但NSArray沒有。

修改字符串:

NSString *myString = @"hello"; 
myString = [myString stringByAppendingString:@" world"]; 

VS

可變對象與數組打交道時特別有用,

比如,如果你有NSMutableStrings的一個NSArray,你可以這樣做:

[myArray makeObjectsPerformSelector:@selector(appendString:) withObject:@"!!!"]; 

哪個會加3!到數組中每個字符串的末尾。

但如果你有NSString的(因此不可變的)的一個NSArray,你不能這樣做(至少這是一個困難得多,並且更多的代碼,比使用的NSMutableString)

1

可變可以改變,不可改變不可以。 當你分享一個可變對象時,你應該期望有人可以改變它。 當你分享一個不可變的對象時,你預期沒有人會改變。

1

還有一些其他的不同之處,有趣的是當一個不可變的對象被複制時將被保留。蘋果公司爲了性能原因還可能存在很多差異,取決於對象是否可變或不可變,例如,子字符串方法是複製其父字符串的實際字節,還是僅僅指向子字符的子範圍父母字符串,如果它是不可變的,可能不是,但誰知道。

5

的基本區別在於:

  • NSString的不能被編輯,只重新分配。這意味着當NSString的值發生變化時,它實際上指向內存中的新位置。

  • NSMutableString對象可以被編輯並保持相同的指針。

一個共同的實際差別是:

  • 如果創建1的NSString,然後分配其他它,然後編輯它們中的一個,他們現在將指向不同串。

  • 如果你對NSMutableStrings做同樣的事情,但是隻編輯其中的一個(不重新分配它),它們都會指向新編輯的對象。

2

大家都說你不能改變/修改不變對象。我有不同的解釋方式。你可以修改它,但你會創建一個指向新對象的指針,它不像你修改舊對象,它的一個品牌。新。目的。任何具有先前指向它的指針的指針都不會看到其更改。但是,如果它的可變對象,任何先前指向的對象將會看到它的值新的值。看例子。 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?

+0

對不起,但這是混淆和不正確的混合物。你不能修改不可變的對象,你當然可以修改存儲在引用類型變量中的值 - 從而改變引用的對象,你應該**不會**將字符串常量強制轉換爲「NSMutableString *」 - 它不會創建一個可變的字符串,賦值給一個變量不會創建任何「新」,因爲答案似乎暗示,等等。 – CRD

+0

@CRD你可以建議編輯? – Honey

+0

對不起,沒有。這將需要相當重寫,並且這裏還有其他答案。 – CRD

相關問題