zoukankan      html  css  js  c++  java
  • 可变类型属性与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修饰一个可变类型的属性

  • 相关阅读:
    Setting up jQuery Unobtrusive Validation
    Valid vs Validate
    HTML Tags containing Vue.js v-if and v-for directives flash at loading
    What does a CSS selector in square brackets select in HTML?
    Template refs
    How to check if a variable is not null?
    Android中的Context
    Android从零基础到App上线
    ConstraintLayout 使用汇总
    ConstraintLayout的使用
  • 原文地址:https://www.cnblogs.com/xwoder/p/4469697.html
Copyright © 2011-2022 走看看