可变类型属性与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修饰一个可变类型的属性

posted @ 2015-04-30 19:34  Xwoder  阅读(197)  评论(0编辑  收藏  举报