#import <Foundation/Foundation.h>
int main(int argc, const char * argv[])
{
@autoreleasepool {
// 字符串 输入 @"abc" ,str.retainCount = 18446744073709551615 T. T 这么神奇...
// NSTaggedPointerString 毛病, 优化数字 , 想避免就使用 较大的字符串 或者 中文...
/*
string是个常量,编译器把NSString对象所表示的数据放到应用程序的二进制文件里,这样运行程序时就可以直接用了,无须再创建NSString对象。NSNumber也类似,它使用了一种叫做“标签指针”(tagged pointer)的概念来标注特定类型的数值。这总做法不使用NSNumber对象,而是把数值有关的全部消息放到指针值里面。运行期系统会在消息派发期间检测到这种标签指针,并对它志向相应操作,使其行为看上去和真正的NSNumber一样。这种优化在某些场合使用,但是浮点数就没有这个优化,保留计数还是1
*/
NSString * str = [NSString stringWithFormat:@"%@", @"成龙"];
NSLog(@"%@", NSStringFromClass([str class])); // NSTaggedPointerString
NSString * str1 = [str copy]; // 产生一个不可变副本
// 不可变的对象, 进行了拷贝以后, 没有重新分配内存空间
// 这是浅拷贝 只是拷贝了地址, 并没有真正的分配新的内存空间.
NSLog(@"%lu", str.retainCount); // 2
NSLog(@"%p", str);
NSLog(@"%p", str1);
NSLog(@"//************************ stone ***");
/*
浅 复 制:在复制操作时,对于被复制的对象的每一层复制都是指针复制。
深 复 制:在复制操作时,对于被复制的对象至少有一层复制是对象复制。
*/
NSString * s = [NSString stringWithFormat:@"%@", @"李连杰"];
NSMutableString * mts = [s mutableCopy];
NSLog(@"%@",NSStringFromClass([[s mutableCopy] class])); // __NSCFString
NSLog(@"%p", s);
NSLog(@"%p", mts);
NSLog(@"%lu", s.retainCount); // 1
NSLog(@"%lu", mts.retainCount); // 1
}
return 0;
}