copy内存管理...


#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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值