参考了一些文章,感觉写的都不够全面,于是决定自己进行实践并整理,用来作为对相关知识的总结。如有不合理之处,欢迎指正。
1、非容器型对象(例如 字符串)
1、属性变量(通过修饰符)
创建model
@interface Fish : NSObject
@property (nonatomic,strong) NSString *strStrong;
@property (nonatomic,copy) NSString *strCopy;
@property (nonatomic,strong) NSMutableString *mutStrStrong;
@property (nonatomic,copy) NSMutableString *mutStrCopy;
@end
//可变字符串进行赋值
NSMutableString *mutString = [NSMutableString stringWithFormat:@"1234"];
Fish *f = [[Fish alloc] init];
f.strStrong = mutString;
f.strCopy = mutString;
f.mutStrStrong = mutString;
f.mutStrCopy = mutString;
[mutString appendFormat:@"456"];
NSLog(@"内容:%@-%@-%@",f.strStrong,f.strCopy,mutString);
NSLog(@"Mut 内容:%@-%@-%@",f.mutStrStrong,f.mutStrCopy,mutString);
NSLog(@"指针:%p-%p-%p",f.strStrong,f.strCopy,mutString);
NSLog(@"Mut 指针:%p-%p-%p",f.mutStrStrong,f.mutStrCopy,mutString);
打印结果:
内容:1234456-1234-1234456
Mut 内容:1234456-1234-1234456
指针:0x1c4444a40-0xa000000343332314-0x1c4444a40
Mut 指针:0x1c4444a40-0xa000000343332314-0x1c4444a40
//总结:
//strong类型变量,不管是可变还是不可变,用可变字符串进行赋值,都是浅拷贝,指向同一个地址(指针拷贝),所以改变字符内容后,对应的内容也发生变化
//copy类型变量,赋值属于深拷贝,指针地址发生变化(内容拷贝),所以改变字符串内容后,该变量不发生变化
//由于 f.strCopy和 f.mutStrCopy指向同一个地址,
//猜想改变一个变量值另一个也会发生变化,
//于是进行以下操作:
//执行[f.mutStrCopy appendFormat:@"456"] 由于f.mutStrCopy类型赋值后已经不可变,
//所以出现Crash
//f.mutStrCopy = @“456”直接赋值,则指针地址发生变化(同下不可变字符串赋值)
//所以此两种情况都不会改变copy变量内容
//不可变字符串赋值
NSString *str = @"123";
Fish *f = [[Fish alloc] init];
f.strStrong = str;
f.strCopy = str;
f.mutStrStrong = str;
f.mutStrCopy = str;
str = @"345";
NSLog(@"内容:%@-%@-%@",f.strStrong,f.strCopy,str);
NSLog(@"Mut 内容:%@-%@-%@",f.mutStrStrong,f.mutStrCopy,str);
NSLog(@"指针:%p-%p-%p",f.strStrong,f.strCopy,str);
NSLog(@"Mut 指针:%p-%p-%p",f.mutStrStrong,f.mutStrCopy,str);
打印结果
内容:123-123-345
Mut 内容:123-123-345
指针:0x104dbc2a0-0x104dbc2a0-0x104dbc2c0
Mut 指针:0x104dbc2a0-0x104dbc2a0-0x104dbc2c0
//总结:
//无论是否可变,不可变字符串赋值只是进行浅拷贝(指针拷贝),指向同一个地址
//对源字符串进行重新赋值,则会指向新的指针地址,但是属性指针还是原来的地址,所以已经赋值的变量不会发生变化
待更新...
网友评论