玩iOS的小伙伴对const应该很不陌生, 在声明全局常量的时候很多时候都会用到,
但是有时候修饰对象很迷惑下面是个人总结, 下面的地址都是模拟的
1.
const NSString *str1 = @"123";
str1 = @"ads";
/*
-- 对象地址 -- 对象 -- 指向的地址 ---- 值 ------ 值地址 ---
| 0x123456 str1 0x654321 || 123 ---- 0x654321 | // const 修饰的是 *str, 而*str 是值, 所以const 修饰的就是值123
| str1 0x654221 || ads ---- 0x654221 | // 因为const 修饰的是值 所以 指针str 还是可变的(可以指向其他值)
*/
2.
NSString const *str2 = @"456";
str2 = @"zxc";
/*
-- 对象地址 -- 对象 -- 指向的地址 ---- 值 ------ 值地址 ---
| 0x123464 str2 0x654311 || 456 ---- 0x654311 | // 与上面同理
| str2 0x654211 || zxc ---- 0x654211 |
*/
3.
NSString* const str3 = @"789";
str3 = @"qwe"; // 报错
/*
-- 对象地址 -- 对象 -- 指向的地址 ---- 值 ------ 值地址 ---
| 0x123478 str3 0x654301 || 789 ---- 0x654301 | // const 修饰的是 str3, 而str3 是指针(指向的是值的地址),
| || | 所以const 修饰的就是值789 的地址值
| 0x123478 str3 0x654301 || qwe ---- 0x654201 | // 因为const 修饰的是指针(指向的是值的地址)
| || | 所以 指针str3 是不可变的(不可以指向其他地址)
*/