美文网首页
@property中strong与copy的区别

@property中strong与copy的区别

作者: c048e8b8e3d7 | 来源:发表于2017-04-12 10:37 被阅读22次

    一 共识

    1 一般情况下,NSStringcopy修饰,其他对象strong修饰
    @property(nonatomic, copy) NSString *name;
    @property(nonatomic, strong) NSMutableArray *titles;
    
    2 strongcopy修饰NSString的影响
    • 正常使用copy修饰NSString
    @property(nonatomic, copy) NSString *name;
    - (void)method
    {
        NSMutableString *str = [NSMutableString stringWithString:@"1"];
        self.name = str;
        [str appendString:@"2"];
        NSLog(@"self.name = %@", self.name);
    }
    

    self.name = 1

    • 使用strong修饰NSString的影响
    @property(nonatomic, strong) NSString *name;
    - (void)method
    {
        NSMutableString *str = [NSMutableString stringWithString:@"1"];
        self.name = str;
        [str appendString:@"2"];
        NSLog(@"self.name = %@", self.name);
    }
    

    self.name = 12

    二 特殊情况

    使用copy修饰可变对象,程序可能意外退出
    @property(nonatomic, copy) NSMutableArray *titles;
    - (void)method
    {
        self.titles = [NSMutableArray arrayWithObjects:@1, @2, nil];
        //下面这条语句报错,因为self.titles实际指向的是一个NSArray对象(不可变)
        [self.titles removeObjectAtIndex:0];
    }
    

    三 原理

    1 copystrong影响的是setter方法的实现,当使用@property声明属性的时候,系统会根据读取权限来生成对应的settergetter方法。
    • strong修饰符默认的setter方法
    @property(nonatomic, strong) NSString *name;
    - (void)setName:(NSString *)name
    {
        _name = name;
    }
    
    • copy修饰符默认的setter方法
    @property(nonatomic, copy) NSString *name;
    - (void)setName:(NSString *)name
    {
        _name = [name copy];
    }
    
    2 如果重写了settter方法,则@property中的strong或者copy定义无效

    下面这个例子中@property中声明的是copy,但是setter方法中用到是strong

    @property(nonatomic, copy) NSString *name;
    - (void)setName:(NSString *)name
    {
        _name = name;
    }
    - (void)method
    {
        NSMutableString *str = [NSMutableString stringWithString:@"1"];
        self.name = str;
        [str appendString:@"2"];
        NSLog(@"self.name = %@", self.name);
    
    }
    

    self.name = 12

    相关文章

      网友评论

          本文标题:@property中strong与copy的区别

          本文链接:https://www.haomeiwen.com/subject/qmnpattx.html