在面试过程中,一些面试官很喜欢问你strong和copy的区别,在这里我做一个个人理解的总结:
首先回答概念性问题:
strong,其实就是retain的意思,只不过ARC,MRC的用法,strong就是强引用,引用计数器会加1,
copy,顾名思义,就是拷贝,但是通常来说分为两种情况,浅拷贝和深拷贝,对于NSString对象来说就是浅拷贝,但是对于NSMutableString来说就是深拷贝,这同样适用于NSArray等
至于浅拷贝和深拷贝,简单点说 浅拷贝就是拷贝了指针,两者都指向同一个指针,深拷贝就是拷贝了内容
NSString *A = @"1";
NSMutableString *B = [[NSMutableString alloc] initWithString:@"2"];
NSLog(@"A:%p,B:%p",&A,&B);
NSLog(@"A:%p,B:%p",A,B);
NSString *AA = [A copy];
NSString *BB = [B copy];
NSMutableString *BBB = [B copy];
NSLog(@"AA:%p,BB:%p,BBB:%p",&AA,&BB,&BBB);
NSLog(@"AA:%p,BB:%p,BBB:%p",AA,BB,BBB);
A:0x7fff5b6eba08,B:0x7fff5b6eba00**
A:0x104534350,B:0x7f9381c04ec0**
AA:0x7fff5b6eb9f8,BB:0x7fff5b6eb9f0,BBB:0x7fff5b6eb9e8**
AA:0x104534350,BB:0xa000000000000321,BBB:0xa000000000000321**
由上面可以得到结果:
NSString通过copy之后生成的新对象的内容还是和copy之前相同
NSMutableString通过copy之后生成的新对象和内容都和copy之前不相同
NSMutableString通过copy之后 生成的无论是NSString还是NSMutableString对象他们的内容也都相同
Copy之后一定会生成新的对象,但是内容与copy前是否相同取决于NSString还是NSMutableString
__weak和__block
在通常的面试当中,你只需要回答到__weak用于解决block循环引用问题,而__block解决block只能访问局部变量而不能修改的问题
__weak typeof(self) weakSelf = self;
更深入点的话,详细解释以下各自的特点:
__block:
1.__block适用于ARC,MRC,并且可以修饰基本数据类型和OC对象
2.__block修饰的对象可以在block中被修改
3.__block修饰的对象不会被block强引用一次,而且不会出现循环引用问题
__weak:
1.__weak只适用于ARC,而且只能修饰OC对象
2.__weak修饰的对象可以说等同于@property(weak)