OC中创建字符串的几种方法及Xcode7.3中其存储内存地址的异同

来源:互联网 发布:js判断上传文件的类型 编辑:程序博客网 时间:2024/05/01 01:31

OC语言中创建字符串的主要方法包括:

  • 1.通过字符串常量直接创建:
NSString *str1 = @"xjq";

该方法是直接在常量存储区开辟一块内存空间用于字符串的存储,str1为该存储空间的地址。

  • 2.通过alloc与initWithFormat创建:
NSString *str2 = [[NSString alloc] initWithFormat:@"xjq"];

该方法在堆内存中开辟一块存储空间,str2为该存储空间的地址。

  • 3.通过alloc与initWithString创建:
NSString *str3 = [[NSString alloc] initWithString:@"xjq"];

创建一个具有只读数据的常量字符串,与“1.通过字符串常量直接创建”相同。事实上Xcode7.3编译器中,如果使用了alloc + initWithString方法,会显示提示,建议修改为字符串常量创建。

  • 4.通过类工厂方法:stringWithFormat创建:
NSString *str4 = [NSString stringWithFormat:@"xjq"];

类工厂方法内部封装了alloc init方法,与2.通过alloc与initWithFormat创建相同。


对相同数据的储存:

对于Xcode7.3,不管是在OS X工程还是iOS工程中,借由编译器自身的优化,若在常量存储空间或堆存储空间内存储同一组字符串,Xcode会将指针指定同一个地址,减少系统占用。

//1.通过字符串常量创建对象        NSString *str1 = @"xjq";        NSString *str11 = @"xjq";        NSLog(@"*str1的内存地址为%p,*str11的内存地址为%p",str1,str11);    //2.通过alloc与initWithFormat创建        NSString *str2 = [[NSString alloc] initWithFormat:@"xjq"];        NSString *str22 =[[NSString alloc] initWithFormat:@"xjq"];        NSLog(@"*str2的内存地址为%p,*str22的内存地址为%p",str2,str22);    //3.通过alloc与initWithString创建        NSString *str3 = [[NSString alloc] initWithString:@"xjq"];        NSString *str33 =[[NSString alloc] initWithString:@"xjq"];        NSLog(@"*str3的内存地址为%p,*str33的内存地址为%p",str3,str33);    //4.通过类工厂方法:stringWithFormat创建        NSString *str4 = [NSString stringWithFormat:@"xjq"];        NSString *str44 =[NSString stringWithFormat:@"xjq"];        NSLog(@"*str4的内存地址为%p,*str44的内存地址为%p",str4,str44);

以上代码输出为:

2016-04-12 12:32:39.761 字符串[3473:3719979] *str1的内存地址为0x100001048,*str11的内存地址为0x1000010482016-04-12 12:32:39.762 字符串[3473:3719979] *str2的内存地址为0x716a7835,*str22的内存地址为0x716a78352016-04-12 12:32:39.762 字符串[3473:3719979] *str3的内存地址为0x100001048,*str33的内存地址为0x1000010482016-04-12 12:32:39.762 字符串[3473:3719979] *str4的内存地址为0x716a7835,*str44的内存地址为0x716a7835Program ended with exit code: 0
0 0