黑马程序员技术交流社区
标题:
在堆中创建字符串对象的疑惑
[打印本页]
作者:
shenlongzs
时间:
2014-4-1 20:05
标题:
在堆中创建字符串对象的疑惑
方法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] ---0x4
6ac
2013-10-14 10:27:02.652 hfjhdfjdhf[897:c07] ---0x75c2360
请问谁能回答下他们的区别?
作者:
FlyTrem
时间:
2014-4-1 22:16
我自己的理解,也不知道对错!
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指向一个新的地址。
作者:
conpgy
时间:
2014-4-1 22:33
根据我的理解。前三个方法的"my string"对象是分配在常量区。即它们是在编译的时候已经分配好了内存,是静态的,固定的,在程序运行的时候不会被改变。也就是说"my string"不是在堆中分配的,而是编译的时候分配的常量。方法1、2、3只不过分别创建了三个指针来指向这块内存区。而至于方法四。initWithFormat:方法是生成格式化字符串。格式化字符串不能确定需要空间的大小。因此创建的字符串需要被分配在堆里面。因此每次调用都会分配新的内存空间。
作者:
shenlongzs
时间:
2014-4-2 19:23
哦 谢谢
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2