const修飾符將其后的變量設(shè)置為常量,即str1和str2為常量止喷,兩者的區(qū)別在于,常量指針是否可以指向其他的內(nèi)存塊
一混聊、NSString的情況
extern NSString * const str1;
NSString *const str1 = @"str1";
// str1 = @"str1***str1";//報錯:Cannot assign to variable 'str1' with const-qualified type 'NSString *const __strong'
總結(jié):常量指針已經(jīng)指向@"str1",不能再指向其他的內(nèi)存@"str1***str1"弹谁,因此不能修改常量指針指向的內(nèi)容,常量指針仍然指向原內(nèi)存中的內(nèi)容句喜。因為是NSString预愤,所以改變指針指向的內(nèi)存,才能改變指針指向的內(nèi)容咳胃,常量指針指向的內(nèi)存不變植康,所指向的內(nèi)容就不會變
extern NSString const * str2;
NSString const *str2 = @"str2";
str2 = @"str2***str2";
總結(jié):常量指針可以指向其他的內(nèi)存,釋放掉原來的內(nèi)存展懈,從而可以修改常量指針指向的內(nèi)容(因為指向的內(nèi)存變了)
NSString *s1 = @"s1";
s1 = @"";//s1指向了新的內(nèi)存销睁,不再指向原來的內(nèi)存,跟原來的內(nèi)存沒有關(guān)系了
總結(jié):當(dāng)我們用字面量語法對一個變量賦值時相當(dāng)于對他重新開辟了內(nèi)存塊标沪,也就是原本的內(nèi)存塊和他是已經(jīng)沒有關(guān)系了榄攀。原來的內(nèi)存因為沒有指針指向,會被釋放回收金句。
二檩赢、NSMutableString的情況
如果把NSString換成NSMutableString情況就不一樣了
NSMutableString const *var1 = [@"str" mutableCopy];
[var1 appendString:@"__var"];//改變內(nèi)存中的內(nèi)容
var1 = [@"123" mutableCopy];//var1指向新的內(nèi)存
NSLog(@"var1:%@",var1);
總結(jié):可以修改原內(nèi)存中的內(nèi)容,也可以指向其他的內(nèi)存
NSMutableString *const var2 = [@"str" mutableCopy];
[var2 appendString:@"__var"];//改變內(nèi)存中的內(nèi)容
var2 = [@"123" mutableCopy];//var2不能指向新的內(nèi)存违寞,報錯:Cannot assign to variable 'var2' with const-qualified type 'NSMutableString *const __strong'
NSLog(@"var2:%@", var2);
總結(jié):可以修改原內(nèi)存中的內(nèi)容贞瞒,不能指向其他的內(nèi)存
大總結(jié):
NSString *const str1
不可以修改常量指針指向的原內(nèi)存中的內(nèi)容,常量指針不可以指向其他的內(nèi)存
NSString const *str2"
不可以修改常量指針指向的原內(nèi)存中的內(nèi)容趁曼,常量指針可以指向其他的內(nèi)存
NSMutableString const *var1
可以修改常量指針指向的原內(nèi)存中的內(nèi)容军浆,常量指針可以指向其他的內(nèi)存
NSMutableString *const var2
可以修改常量指針指向的原內(nèi)存中的內(nèi)容,常量指針不可以指向其他的內(nèi)存