NSxxxx 、NSMutablexxxx 、const之间的关系都差不多、这里用NSString 、NSMutableString来讲
- NSString的不可变
NSString *string = @"one"; //其实是string指针指向的地址的内容不可变(如@“one”的内容是不可变的)
//问题1 :@“one”的内容为啥不可变?
//猜测 :内容是const *
string = @"two"; //但是string指针可以指向别的地址(如@“two”的地址)
//这里的@“one”、@“two”存储在常量区、不需要担心内存的问题
//如果是alloc、new、copy (堆)记得释放内存 , 当string指向新的地址时候
- NSMutableString的可变
NSMutableString *string = @"one"; //这里会报警告,因为想用一个NSString * 去初始化一个
//问题1 : 为啥会警告 ?
//猜测 :NSString *类型指向的地址的内容是const * , NSMutableString *指向的地址的内容是普通 *
NSMutableString *string1 = [NSMutableString stringWithFormat:@"%d a!", 10];
//这里的string1所指向的@“10 a!” 可以增删改插 ,所以说可变指的内容的可变
string1 = [NSMutableString stringWithFormat:@"%d bbb!", 10];
//string1也可以指向别的地址
- const 与 NSString
const NSString * string = @"ONE";
NSString const * string = @"ONE"; //这两句等价 , 同样是让指向的内容不可以改变
//问题1 : NSString 本来就是不可变的 , 那加上const是相同的效果 , 有什么不一样
//猜测 :?
string = @"TWO"; //指向了别的@“TWO”的地址
NSLog(@"%@",string); //输出了TWO
NSString * const string = @"ONE";
//string = @"TWO"; //指向了别的@“TWO”的地址 ,由于const 的原因会发报错
//*string = @"TWO" //会报错 , assigning to 'NSString' from imcompatible type 'NSString *'
//问题2 : 为啥会报错 ?
//猜测 :?
const NSString * const string = @"ONE";
NSString const * const string = @"ONE"; //这两句等价 , 指针的指向不可改变, 指针指向的内容不可改变
- const 与 NSMutableString
const NSMutableString * string = [NSMutableString stringWithFormat:@"%d a!", 10];
NSMutableString const * string = [NSMutableString stringWithFormat:@"%d a!", 10];
//这两句等价 , 同样是让指向的内容不可以改变
string = [NSMutableString stringWithFormat:@"%d bbb!", 10]; //指向了别的的地址
NSLog(@"%@",string); //输出了10 bbb!
*string = @"SSS"; //!!!报错 ,string 为const * (只读)不可改变
NSMutableString * const string = [NSMutableString stringWithFormat:@"%d a!", 10];
//*string = @"SSS";
//报错 ,assigning to nsmutablestring incompatile type nsstring
string = [NSMutableString stringWithFormat:@"%d bbb!", 10];
//报错 , 因为const 修饰的缘故不能指向别的地址
const NSMutableString * const string = [NSMutableString stringWithFormat:@"%d a!", 10];
//指向的地址不可以改变 , 指向的内容不可以改变 , 全是因为const 的修饰