iOS 里const在修饰对象时候的用法

玩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 是不可变的(不可以指向其他地址)
*/
原文地址:https://www.cnblogs.com/MrTao/p/8609621.html