NSString的copy与strong使用
2017-11-08 本文已影响44人
XueYongWei
字符串为何常用copy
用 @property 声明 NSString、NSArray、NSDictionary 经常使用 copy 关键字,是因为他们有对应的可变类型:NSMutableString、NSMutableArray、NSMutableDictionary,他们之间可能进行赋值操作(就是把可变的赋值给不可变的)。
使用情形分析
- 不可变字符串NSString使用copy
@property (nonatomic,copy) NSString *str1;
@property (nonatomic,copy) NSString *str2;
///...
self.str1 = @"哈哈哈";
self.str2 = self.str1;
self.str1 = @"笑个屁";
NSLog(@"st1= %@ st2 = %@",self.str1,self.str2);
结果输出毫无意外为testCopy[18155:1827933] st1= 笑个屁 st2 = 哈哈哈
- 不可变字符串NSString使用Strong
@property (nonatomic,strong) NSString *str1;
@property (nonatomic,strong) NSString *str2;
///...
self.str1 = @"哈哈哈";
self.str2 = self.str1;
self.str1 = @"笑个屁";
NSLog(@"st1= %@ st2 = %@",self.str1,self.str2);
结果输出为testCopy[18155:1827933] st1= 笑个屁 st2 = 哈哈哈
NSString是OC对象,但内存管理是个例外,直接修改strong类型的NSString,并不会直接更改指向内存中的内容,而是指向新的字符串的地址。
- 可变字符串赋值给使用Strong的不可变字符串NSString
@property (nonatomic,strong) NSMutableString *str1;
@property (nonatomic,strong) NSString *str2;
///...
self.str1 = [NSMutableString stringWithFormat:@"哈哈哈"];
self.str2 = self.str1;
[self.str1 setString:@"!!"];
NSLog(@"st1= %@ st2 = %@",self.str1,self.str2);
结果输出为testCopy[18545:1878553] st1= !! st2 = !!
不可变字符串使用strong,即持有了可变字符串str2,当str2改变的时候,str1也会改变,如果str2仅仅是想得到此时str1的值并自己使用,那就会在str1改变的时候出现意外。
需要注意的是,如果对可变字符串str1使用了赋值“=”操作
@property (nonatomic,strong) NSMutableString *str1;
@property (nonatomic,strong) NSString *str2;
///...
self.str1 = [NSMutableString stringWithFormat:@"哈哈哈"];
self.str2 = self.str1;
//[self.str1 setString:@"!!"];
self.str1 = [NSMutableString stringWithFormat:@"笑个屁"];
NSLog(@"st1= %@ st2 = %@",self.str1,self.str2);
结果输出为testCopy[18741:1898851] st1= 笑个屁 st2 = 哈哈哈
此时不是改变了str1,而是重新赋值,str1指向了"笑个屁"的地址,而str2仍然指向“哈哈哈”
可变数组的“改变”方法有
- (void)insertString:(NSString *)aString atIndex:(NSUInteger)loc;
- (void)deleteCharactersInRange:(NSRange)range;
- (void)appendString:(NSString *)aString;
- (void)appendFormat:(NSString *)format, ... NS_FORMAT_FUNCTION(1,2);
- (void)setString:(NSString *)aString;
所以在对NSString不可变操作时,使用copy和strong均无影响,如果NSString指向了NSMutableString,那么copy为“拷贝值”,而strong则为“指向”。