@property中strong与copy的区别

2017-04-12  本文已影响22人  c048e8b8e3d7

一 共识

1 一般情况下,NSStringcopy修饰,其他对象strong修饰
@property(nonatomic, copy) NSString *name;
@property(nonatomic, strong) NSMutableArray *titles;
2 strongcopy修饰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

@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方法。
@property(nonatomic, strong) NSString *name;
- (void)setName:(NSString *)name
{
    _name = name;
}
@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

上一篇下一篇

猜你喜欢

热点阅读