关于const 、NSxxxx(不可变)、NSMutablexxxx(可变) 的区别

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 的修饰
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值