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
文件。
- Podfile.lock :文件里存储着我们已经安装的依赖库(pods)的版本。
-
$ pod --version
:检查pod版本 -
$ pod env
: 查看已经安装的cocoapods版本。 -
$ pod outdated
:查看Podfile文件中的依赖库的最新版本。 -
$ pod setup
:安装本地库 -
$ pod search 'AFNetworking'
:搜索某库 -
$ pod install
:一般是第一次运行Pod时使用,会为每一个它安装的pod库在Podfile.lock文件中写入其版本号。
再次使用时:只会处理没有记录在Podfile.lock中的依赖库,会查找匹配Podfile中描述的版本。
1、不指定版本的匹配最新
2、指定版本的不更新 -
pod update
:不考虑Podfile.lock中版本的情况,会查找匹配Podfile中描述的版本。
1、不指定版本的匹配最新
2、指定版本的不更新