iOS全解11:特殊问题

2021-03-04  本文已影响0人  lukyy
1、浅拷贝和深拷贝的区别?

浅拷贝:只复制指向对象的指针,指针指向同一个地址,而不复制引用对象本身。
深拷贝:复制引用对象本身。内存中存在了两份独立对象本身,指针指向新的内存,当修改A 时,B 不变。(即:B = [A copy]; )

2、NSString为什么经常用copy修饰,用strong会有什么问题?`

copy修饰的会重新拷贝一份,是新的内存地址(可变的对象 被copy后,会变成不可变的),值不会跟随改变。

strong是强引用,指针指向原来的地址,值会跟随对象值的变化而变化。

@interface ViewController ()
@property (nonatomic, strong) NSString  *str1;
@property (nonatomic, copy)   NSString  *str2;
@end

@implementation ViewController
- (void)viewDidLoad {
    [super viewDidLoad];

    NSMutableString *mtStr = [NSMutableString stringWithFormat:@"hello"];
    self.str1 = mtStr;
    self.str2 = mtStr;
    [mtStr appendString:@"World"];

    NSLog(@"---mtStr= %p  \n---str1:%p\n---str2:%p", mtStr, self.str1,self.str2);
    NSLog(@"str1= %@ \n---%@", self.str1, self.str2);
}

打印结果:
---mtStr= 0x281e945a0
---str1=  0x281e945a0         // strong 修饰(指向原来的地址)
---str2=  0xa00006f6c6c65685  // copy 修饰(指向新的地址)
str1= helloWorld  // strong 修饰(指向原来的地址)
str2= hello       // copy 修饰(指向新的地址)

注意:如果对象是可变的,不管使用copy还是mutableCopy,都会开辟新的内存空间(深拷贝)。 比如: 对NSMutableString进行copy或者mutableCopy

结论:copy与mutableCopy 要看拷贝的对象是不可变的还是可变的。

1、如果拷贝的对象是 <不可变的> 例如:NSString *strA, 那么
B = [strA copy]:copy只是浅拷贝 ,不会开辟新的内存
C = [strA mutableCopy] :mutableCopy是深拷贝, 会开辟新的内存。

2、如果对象是 <可变的>,例如:NSMutableString *mutableStrA,那么copy和mutableCopy都会开辟新的内存,都是深拷贝。
D = [mutableStrA copy]
E = [mutableStrA mutableCopy]

3、自定义对象的拷贝都是深拷贝。自定义对象必须实现 NSCoping 和NSMutableCoping 协议,并实现copyWithZone或者mutableCopyWithZone,才能拷贝。

NSString *strA = @"aaa";
id strB = [strA copy];
id strC = [strA mutableCopy];
NSLog(@"\n---strA= %p \n---strB= %p\n---strC= %p", strA, strB, strC);

---strA= 0x10aa9a1b0
---strB= 0x10aa9a1b0  //浅拷贝:只拷贝指针
---strC= 0x600002eab030 //深拷贝:拷贝对象和新指针
NSMutableString *strA = [NSMutableString stringWithFormat:@"aaa"];;
id strD = [strA copy];
id strE = [strA mutableCopy];
NSLog(@"\n---strA= %p \n---strD= %p\n---strE= %p", strA, strD, strE);
---strA= 0x600000185080
---strD= 0xdfc88a36c03c694e //深拷贝:拷贝对象和新指针
---strE= 0x600000185200 //深拷贝:拷贝对象和新指针
3、pod install 和 pod update 的区别?

当我们用 CocoaPods 新建一个Podfile文件运行后,会自动生成一个Podfile.lock文件。



持续更新。。。



上一篇下一篇

猜你喜欢

热点阅读