A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© shenlongzs 中级黑马   /  2014-4-1 20:05  /  1313 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

方法1.直接赋值: NSString *str1 = @"my string";
方法2.类函数初始化生成: NSString *str2 = [NSString stringWithString:str1];
方法3.实例方法初始化生成: NSString *str3 = [[NSString alloc] initWithString:@"my string"];
                         NSString *str4 = [[NSString alloc]initWithFormat:@"my string"];
  
NSLog(@"---%p",str1);
NSLog(@"---%p",str2);
NSLog(@"---%p",str3);
NSLog(@"---%p",str4);
运行结果;
2013-10-14 10:27:02.650 hfjhdfjdhf[897:c07] ---0x46ac
2013-10-14 10:27:02.651 hfjhdfjdhf[897:c07] ---0x46ac
2013-10-14 10:27:02.651 hfjhdfjdhf[897:c07] ---0x46ac
2013-10-14 10:27:02.652 hfjhdfjdhf[897:c07] ---0x75c2360



请问谁能回答下他们的区别?

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1 以后贴代码的时候尽量用代码块.

查看全部评分

3 个回复

倒序浏览
我自己的理解,也不知道对错!

NSString *str1 = @"my string";
这句你创建了一个字符串对象,内存中开辟了一块存储空间,有个地址,并用指针str1指向了这个地址。
NSString *str2 = [NSString stringWithString:str1];
创建了一个字符串指针指向你传进来的字符串的地址,也就是str2和str1指向同一块内存,地址是一样的。
NSString *str3 = [[NSString alloc] initWithString:"my string"];
这个是调用initWithString方法创建的字符串,而这个方法产生的是常量字符串类型,在常量区开辟存储空间,而上面的str1也是字符串常量,也是在常量区开辟的存储空间,为了避免重复存储相同的常量,会寻找有没相同的常量,有则直接指向这块内存地址,没有则重新分配,而有了这个str1这个字符串,所以str3直接指向str1的地址
NSString *str4 = [[NSString alloc]initWithFormat:"my string"];
而initWithFormat:方法是动态创建对象的,是可变的是变量,变量与常量的存储内存空间是不一样的,所以会在另一块内存中分配存储空间,所以str4指向一个新的地址。


评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

回复 使用道具 举报
根据我的理解。前三个方法的"my string"对象是分配在常量区。即它们是在编译的时候已经分配好了内存,是静态的,固定的,在程序运行的时候不会被改变。也就是说"my string"不是在堆中分配的,而是编译的时候分配的常量。方法1、2、3只不过分别创建了三个指针来指向这块内存区。而至于方法四。initWithFormat:方法是生成格式化字符串。格式化字符串不能确定需要空间的大小。因此创建的字符串需要被分配在堆里面。因此每次调用都会分配新的内存空间。
回复 使用道具 举报
哦  谢谢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马