iOS中NSString存储方式和内存管理方式

550 阅读1分钟
NSString *  s1 = @"123456789";
NSString *  s2 = @"123456789";

该声明方式s1、s2存储在字符串的常量池中,类型为**__NSCFConstantString,常量池中数据循环使用,s1与s2的地址一致0x10e8ae140**

    NSString *  s3 = [NSString stringWithFormat:@"123456789"];
   NSString *  s4 = [[NSString alloc] initWithFormat:@"123456789"];

该声明方式,s3、s4类型为NSTaggedPointerString,没有引用计数,s3与s4地址一样,存放在堆区0xd9c919e3e01acbcf

    NSString *  s5 = [NSString stringWithFormat:@"1234567890"];    
    NSString *  s6 = [[NSString alloc] initWithFormat:@"1234567890"];

该声明方式,s5、s6类型为**__NSCFString****,s5引用计数为2(该声明方式自动调用autorelease),s6引用计数为1,s5与s6地址不一样,存放在堆区**0x600001d0a280

    NSString *  s7 = [NSString stringWithString:@"1234567890"];    
    NSString *  s8 = [[NSString alloc] initWithString:@"1234567890"];

该声明方式,s7、s8类型为****__NSCFConstantString**,,s7与s8地址一样,存放在常量区;**

WithString:的声明方式,如果参数是NSTaggedPointerString或者****__NSCFConstantString类型,返回对象地址为参数的地址,如果参数是**__NSCFString类型,****返回对象**地址为新的的地址