一 共識(shí)
1 一般情況下漓糙,NSString
用copy
修飾绿聘,其他對(duì)象
用strong
修飾
@property(nonatomic, copy) NSString *name;
@property(nonatomic, strong) NSMutableArray *titles;
2 strong
與copy
修飾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修飾可變對(duì)象,程序可能意外退出
@property(nonatomic, copy) NSMutableArray *titles;
- (void)method
{
self.titles = [NSMutableArray arrayWithObjects:@1, @2, nil];
//下面這條語(yǔ)句報(bào)錯(cuò)暇矫,因?yàn)閟elf.titles實(shí)際指向的是一個(gè)NSArray對(duì)象(不可變)
[self.titles removeObjectAtIndex:0];
}
三 原理
1 copy
和strong
影響的是setter方法的實(shí)現(xiàn)票渠,當(dāng)使用@property
聲明屬性的時(shí)候拂檩,系統(tǒng)會(huì)根據(jù)讀取權(quán)限來(lái)生成對(duì)應(yīng)的setter
和getter
方法。
- strong修飾符默認(rèn)的setter方法
@property(nonatomic, strong) NSString *name;
- (void)setName:(NSString *)name
{
_name = name;
}
- copy修飾符默認(rèn)的setter方法
@property(nonatomic, copy) NSString *name;
- (void)setName:(NSString *)name
{
_name = [name copy];
}
2 如果重寫(xiě)了settter方法又厉,則@property中的strong或者copy定義無(wú)效
下面這個(gè)例子中@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