开发环境Xcode8.1
</br>
</br>
copy和strong属性的例子
//TestClass.h
@interface TestClass : NSObject
@property (copy, nonatomic) NSString *nameCopy;
@property (strong, nonatomic) NSString *nameStrong;
@end
//TestClass.m
#import "TestClass.h"
@implementation TestClass
@end
//main.m
#import <Foundation/Foundation.h>
#import "TestClass.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSMutableString *name = [[NSMutableString alloc] initWithString:@"name"];
TestClass *test = [[TestClass alloc] init];
test.nameCopy = name; //分别给2个name属性赋值
test.nameStrong = name;
[name appendString:@"Mutable"]; //修改可变字符串
NSLog(@"nameCopy = %@", test.nameCopy); //输出
NSLog(@"nameStrong = %@", test.nameStrong);
}
return 0;
}
[2228:87707] nameCopy = name
[2228:87707] nameStrong = nameMutable
nameCopy没有变,nameStrong跟着改变了。
因为nameCopy加了copy修饰符之后,有个上帝自动在setNameCopy:方法上做了手脚。
我们也可以试着做上帝,给身为strong的属性变得像copy一样,修改TestClass.m:
//TestClass.m
#import "TestClass.h"
@implementation TestClass
- (void)setNameStrong:(NSString *)nameStrong {
_nameStrong = [nameStrong copy];
}
@end
其他都不改,再次运行程序:
[2238:91282] nameCopy = name
[2238:91282] nameStrong = name
也就是在属性加了copy,会在赋值方法中自动获得一份参数的拷贝,并赋值给属性,即使传进来的参数在外面有变故,也不会影响我的属性值。
copy很适用于所有基类不可变,但有可变子类的值类。包括NSArray、NSDictionary、NSSet、NSString和NSData等等。所以在创建属性时就要考虑是否要让这个属性随着外部参数改变而改变。