美文网首页
NSString的copy与strong使用

NSString的copy与strong使用

作者: XueYongWei | 来源:发表于2017-11-08 15:47 被阅读44次

    字符串为何常用copy

    用 @property 声明 NSString、NSArray、NSDictionary 经常使用 copy 关键字,是因为他们有对应的可变类型:NSMutableString、NSMutableArray、NSMutableDictionary,他们之间可能进行赋值操作(就是把可变的赋值给不可变的)。

    使用情形分析

    1. 不可变字符串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 = 哈哈哈

    1. 不可变字符串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,并不会直接更改指向内存中的内容,而是指向新的字符串的地址。

    1. 可变字符串赋值给使用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则为“指向”。

    相关文章

      网友评论

          本文标题:NSString的copy与strong使用

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