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 总结
- 对于nsstring来说:
1.1 stringwithstring方法创建的字符串与对应的字符串常量占用相同的内存地址,并且重复调用该方法创建相似的(相同)字符串,其内存地址相同且与对应的字符串常量相同。
1.2 stringwithformat方法创建的字符串和对应的字符串常量占用不同的内存地址,并且重复调用该方法创建相似的(相同)字符串,其内存地址相同,但是与对应的字符串常量不相同。 - 对于nsmutablestring来说:
stringwithstring和stringwithformat方法创建的字符串与对应的字符串常量占用不相同的内存地址,并且重复调用该方法创建相似的(相同)字符串,其内存地址不相同,与对应的字符串常量也相同。 - initwithstring和initwithformat方法具有相同的区别。
- 数组不适用上面的规则,就算重复创建相似的(相同)的常量,其内存地址也是不同的。
4 待完善
- 仅仅知道了这个现象,还没有弄清楚其原因?