copy的使用...NSStringFromClass([string class])... NSTaggedPointerString

150 篇文章 0 订阅

浅拷贝 & 深拷贝 

copy 就是浅拷贝, 因为没有产生新的对象(有没有产生新的对象也是判断深浅拷贝的标准)

mutableCopy 就是深拷贝, 会再内存中重新分配一块内存空间.


#import "Person.h"
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[])
{
	@autoreleasepool {
		Person * p = [[Person alloc] init];

		NSMutableString * name = [NSMutableString stringWithFormat:@"%@", @"zhangsan"];
		// p.name NSString 接收 name NSMutableString 没有警告??

		p.name = name; // 因为是strong 所以p.name 指针指向 name 堆空间.
		// 如果是copy , p.name 指向重新开辟一个空间(不可变副本, 如NSString, 不是NSMutableString) 存放 name 再指向此地址.

		NSLog(@"%@", p.name);

		[name replaceCharactersInRange:NSMakeRange(0, 5) withString:@"li"];
		p.name = @"wuliao";
		NSLog(@"%@", p.name);

		//************************ stone ***

		NSString * str = @"hello world";
		id str1 = [str copy]; // __NSCFConstantString , CF = core foundation
		id str2 = [str mutableCopy]; // __NSCFString

		NSLog(@"%@", NSStringFromClass([str1 class])); // __NSCFConstantString 不可变
		NSLog(@"%@", NSStringFromClass([str2 class])); // __NSCFString 可变
        // 能调用 appendString 表示 是NSMutableString
		[str2 appendString:@"xxx"]; // hello worldxxx
		NSLog(@"%@", str2);
		NSLog(@"%@", NSStringFromClass([str2 class])); // __NSCFString

        NSLog(@"%@",@"===============");//************************ stone ***

        NSMutableString * s = [NSMutableString stringWithFormat:@"%@",@"woshishui"];
        id s1 = [s copy]; //NSTaggedPointerString
        id s2 = [s mutableCopy]; //__NSCFString
        [s2 appendString:@"jjj"];
        NSLog(@"s2 = %@",s2); // s2 = woshishuijjj

        NSLog(@"%@", NSStringFromClass([s1 class])); // NSTaggedPointerString 不可变 | 在OS X 10.10中,NSString就采用了这项技术 | 有待研究...
        NSLog(@"%@", NSStringFromClass([s2 class])); // __NSCFString 可变

        NSLog(@"%@",@"===============");//************************ stone ***

        NSMutableString * mts = [NSMutableString stringWithFormat:@"%@",@"mama"];
        NSString * string = @"baba";
        NSLog(@"mts = %p",mts);
                NSLog(@"string = %p",string);

        string = mts; // 多态吗? 父类指针 指向 子类空间
        NSLog(@"string = %p",string);
        NSLog(@"%@",NSStringFromClass([string class])); // __NSCFString 即便是可变空间, 用NSString接收的, 依然没有 appendString 方法...


	}
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值