OC基础—关于不同字符串创建方法创建的字符串的存储地址的研究

1 摘要

不同字符串创建方法创建的字符串,其内存地址分配原则是不同的,具体的区别看下面的例子。

2 实例代码



#import "Foundation/Foundation.h"

int main()
{

    NSString *s = @"123";
    NSString *ss = @"1234";

#pragma mark 此二者都是指向@“123"这个字符串常量,所以其地址相同。
    NSString *s1 = [NSString stringWithString:@"123"];
    NSString *s2 = [NSString stringWithString:@"123"];

#pragma mark 重点1:此二者没有指向@”123“常量,但是同样的方法创建两次得到的对象是同一个对象。
    NSString *s3 = [NSString stringWithFormat:@"123"];
    NSString *s4 = [NSString stringWithFormat:@"123"];

    NSLog(@"s= %p, s1= %p, s2= %p, s3= %p, s4= %p", s, s1, s2, s3, s4);

    NSMutableString *sss = @"123";
#pragma  mark 此二者和常量没有关系,而且同样的方法创建的两次得到的对象也不是同一个对象。
    NSMutableString *s5 = [NSMutableString stringWithString:s];
    NSMutableString *s6 = [NSMutableString stringWithString:s];

#pragma  mark 此二者和常量没有关系,而且同样的方法创建的两次得到的对象也不是同一个对象。
    NSMutableString *s7 = [NSMutableString stringWithString:@"123"];
    NSMutableString *s8 = [NSMutableString stringWithString:@"123"];

#pragma  mark 此二者和常量没有关系,而且同样的方法创建的两次得到的对象也不是同一个对象。
    NSMutableString *s9 = [NSMutableString stringWithFormat:@"123"];
    NSMutableString *s10 = [NSMutableString stringWithFormat:@"123"];

    NSLog(@"s= %p, sss= %p, s5= %p, s6= %p, s7= %p, s8= %p, s9= %p, s10= %p", s, sss, s5, s6, s7, s8, s9, s10);

#pragma mark 下面的方法创建的字符串和常量@"1234”无关,但是和编辑之前的字符串占用相同的内存。
    [s5 appendString:@"4"];
    [s6 appendString:@"4"];

    [s7 appendString:@"4"];
    [s8 appendString:@"4"];

    NSLog(@"ss= %p, s5= %p, s6= %p, s7= %p, s8= %p", ss, s5, s6, s7, s8);

#pragma mark 数组并不遵守上面的规则。
    NSArray *a = @[@1, @2, @3];
    NSArray *aa = @[@1, @2, @3, @4];

#pragma mark 重点2:下面的方法创建的两个数组占用不同的内存。
    NSArray *aaa = @[@"12", @"123", @"1234"];
    NSArray *aaaa= @[@"12", @"123", @"1234"];

    NSArray *a1 = [NSArray arrayWithArray:a];
    NSArray *a2 = [NSArray arrayWithArray:a];

    NSArray *a3 = [NSArray arrayWithObjects:@1, @2, @3, nil];
    NSArray *a4 = [NSArray arrayWithObjects:@1,@2, @3, nil];

    NSLog(@"a= %p, aa= %p, aaa= %p, aaaa= %p, a1= %p, a2= %p, a3= %p, a4= %p", a, aa, aaa, aaaa, a1, a2, a3, a4);

#pragma mark 重点3:initwithstring和initwithformat方法具有相同的区别。
/*
     NSString *s = @"123";
     NSString *ss = @"1234";

     #pragma mark 此二者都是指向@“123"这个字符串常量,所以其地址相同。
     NSString *s1 = [[NSString alloc]initWithString:@"123"];
     NSString *s2 = [[NSString alloc]initWithString:@"123"];

     #pragma mark 重点1:此二者没有指向@”123“常量,但是同样的方法创建两次得到的对象是同一个对象。
     NSString *s3 = [[NSString alloc]initWithFormat:@"123"];
     NSString *s4 = [[NSString alloc]initWithFormat:@"123"];

     NSLog(@"s= %p, s1= %p, s2= %p, s3= %p, s4= %p", s, s1, s2, s3, s4);

     NSMutableString *s7 = [[NSMutableString alloc]initWithString:@"123"];
     NSMutableString *s8 = [[NSMutableString alloc]initWithString:@"123"];

     #pragma  mark 此二者和常量没有关系,而且同样的方法创建的两次得到的对象也不是同一个对象。
     NSMutableString *s9 = [[NSMutableString alloc]initWithFormat:@"123"];
     NSMutableString *s10 = [[NSMutableString alloc]initWithFormat:@"123"];

     NSLog(@"s= %p, s7= %p, s8= %p, s9= %p, s10= %p", s, s7, s8, s9, s10);
*/

    return 0;

}

3 总结

  1. 对于nsstring来说:
    1.1 stringwithstring方法创建的字符串与对应的字符串常量占用相同的内存地址,并且重复调用该方法创建相似的(相同)字符串,其内存地址相同且与对应的字符串常量相同。
    1.2 stringwithformat方法创建的字符串和对应的字符串常量占用不同的内存地址,并且重复调用该方法创建相似的(相同)字符串,其内存地址相同,但是与对应的字符串常量不相同。
  2. 对于nsmutablestring来说:
    stringwithstring和stringwithformat方法创建的字符串与对应的字符串常量占用不相同的内存地址,并且重复调用该方法创建相似的(相同)字符串,其内存地址不相同,与对应的字符串常量也相同。
  3. initwithstring和initwithformat方法具有相同的区别。
  4. 数组不适用上面的规则,就算重复创建相似的(相同)的常量,其内存地址也是不同的。

4 待完善

  1. 仅仅知道了这个现象,还没有弄清楚其原因?
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值