const修饰符将其后的变量设置为常量,即str1和str2为常量,两者的区别在于,常量指针是否可以指向其他的内存块
一、NSString的情况
extern NSString * const str1;
NSString *const str1 = @"str1";
// str1 = @"str1***str1";//报错:Cannot assign to variable 'str1' with const-qualified type 'NSString *const __strong'
总结:常量指针已经指向@"str1",不能再指向其他的内存@"str1***str1",因此不能修改常量指针指向的内容,常量指针仍然指向原内存中的内容。因为是NSString,所以改变指针指向的内存,才能改变指针指向的内容,常量指针指向的内存不变,所指向的内容就不会变
extern NSString const * str2;
NSString const *str2 = @"str2";
str2 = @"str2***str2";
总结:常量指针可以指向其他的内存,释放掉原来的内存,从而可以修改常量指针指向的内容(因为指向的内存变了)
NSString *s1 = @"s1";
s1 = @"";//s1指向了新的内存,不再指向原来的内存,跟原来的内存没有关系了
总结:当我们用字面量语法对一个变量赋值时相当于对他重新开辟了内存块,也就是原本的内存块和他是已经没有关系了。原来的内存因为没有指针指向,会被释放回收。
二、NSMutableString的情况
如果把NSString换成NSMutableString情况就不一样了
NSMutableString const *var1 = [@"str" mutableCopy];
[var1 appendString:@"__var"];//改变内存中的内容
var1 = [@"123" mutableCopy];//var1指向新的内存
NSLog(@"var1:%@",var1);
总结:可以修改原内存中的内容,也可以指向其他的内存
NSMutableString *const var2 = [@"str" mutableCopy];
[var2 appendString:@"__var"];//改变内存中的内容
var2 = [@"123" mutableCopy];//var2不能指向新的内存,报错:Cannot assign to variable 'var2' with const-qualified type 'NSMutableString *const __strong'
NSLog(@"var2:%@", var2);
总结:可以修改原内存中的内容,不能指向其他的内存
大总结:
NSString *const str1
不可以修改常量指针指向的原内存中的内容,常量指针不可以指向其他的内存
NSString const *str2"
不可以修改常量指针指向的原内存中的内容,常量指针可以指向其他的内存
NSMutableString const *var1
可以修改常量指针指向的原内存中的内容,常量指针可以指向其他的内存
NSMutableString *const var2
可以修改常量指针指向的原内存中的内容,常量指针不可以指向其他的内存
网友评论