copy赋值时会开辟一个新的内存区域,而 strong 则不会。使用 copy 可以防止不可变的属性被赋值的是可变的数据时,因为可变数据的改变而改变属性的值。举个例子
@interfaceTest:NSObject
@property(nonatomic,strong)NSString*str1;
@property(nonatomic,copy)NSString*str2;
@end
#import"Test.h"
int main(intargc,constchar* argv[]) {
@autoreleasepool{
NSMutableString*str = [NSMutableStringstringWithString:@"hello"];
Test *test = [[Test alloc]init];
test.str1 = str;
test.str2 = str;
[str appendString:@" world"];
NSLog(@"str:%@ str1:%@ str2:%@",str,test.str1,test.str2);
}
return0;
}
这段代码的输出结果是: str:hello world str1:hello world str2:hello
copy的作用应该显而易见了.
这里我们需要了解一点,copy修饰的NSString在进行set操作时,底层是这样实现的:
我们还是举上面那个例子,进行str = sourceStr操作时,内部会执行一个操作:
str = [sourceStr copy];
那么这个copy里面做了什么呢?
if ([str isMemberOfClass:[str class]])
没错,就是进行一次判断,判断来源是可变的还是不可变的,如果是不可变,那么好,接下来的操作就跟strong修饰的没有区别,进行浅拷贝;如果是可变的,那么会进行一次深拷贝
isKindOfClass来确定一个对象是否是一个类的成员,或者是派生自该类的成员。
isMemberOfClass只能确定一个对象是否是当前类的成员。
网友评论