可变类型属性与copy
代码:
@import Foundation; /************************************************** * Man类 **************************************************/ @interface Man : NSObject // 潜在风险:使用属性修饰符copy修饰一个可变类型的属性 @property (copy, nonatomic) NSMutableString *name; @end @implementation Man @end /************************************************** * main函数 **************************************************/ int main(int argc, const char * argv[]) { @autoreleasepool { NSMutableString *nameMutableString = [NSMutableString stringWithString:@"AAA"]; Man *man = [[Man alloc] init]; // 通过属性的set方法给属性赋值后,属性值的实际类型都将是不可变的类型,其执行效果类似于如下语句 // man->_name = nameMutableString.copy; man.name = nameMutableString; // 属性的类型不再是可不变类型 NSLog(@"[man.name isKindOfClass:NSMutableString.class] = %@", [man.name isKindOfClass:NSMutableString.class] ? @"YES" : @"NO"); NSLog(@"[man.name isKindOfClass:NSString.class] = %@", [man.name isKindOfClass:NSString.class] ? @"YES" : @"NO"); // 执行如下语句,程序可能会崩溃 // [man.name setString:@"BBB"]; } return 0; }
输出:
[man.name isKindOfClass:NSMutableString.class] = NO [man.name isKindOfClass:NSString.class] = YES
总结:
谨慎使用属性修饰符copy修饰一个可变类型的属性
豪情壮志铁傲骨,原来英雄是孤独。