iOS中NSString分别用weak、strong、copy修饰,会有什么样的效果?

101 阅读1分钟

话不多说,先上代码

@interface ViewController ()
@property(nonatomic,weak)NSString *weakString;
@property(nonatomic,weak)NSString *weakString2;
@property(nonatomic,weak)NSString *weakString3;
@property (nonatomic, strong) NSString   *str1;
@property (nonatomic, copy)   NSString   *str2;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    self.view.backgroundColor = [UIColor whiteColor];
    [self InitUI];
}
-(void)InitUI{
    NSMutableString *mtStr = [NSMutableString stringWithFormat:@"hello"];
    self.str1 = mtStr;
    self.str2 = mtStr;
    [mtStr appendString:@"world"];
    NSLog(@"mtStr:%p,,str1:%p,, str2:%p",mtStr, self.str1,self.str2);
    NSLog(@"%@-------%@",self.str1, self.str2);
    NSString *string = [NSString stringWithFormat:@"1234567890"];
    self.weakString = string;
    self.weakString2 = @"1234567890";
    self.weakString3 = [NSString stringWithFormat:@"123"];
}
-(void)viewWillAppear:(BOOL)animated{
    [super viewWillAppear:animated];
    NSLog(@"viewWillAppear==weakString=%@  weakString2=%@ weakString3=%@",self.weakString,self.weakString2,self.weakString3);
}
-(void)viewDidAppear:(BOOL)animated{
    [super viewDidAppear:animated];
    NSLog(@"viewDidAppear==weakString=%@  weakString2=%@ weakString3=%@",self.weakString,self.weakString2,self.weakString3);
}

通过上述代码,运行可以得知如下结果

如果一个字符串NSString用strong修饰,因其有对应的NSMutableString,若NSString的赋值来源是NSString时,strong 与copy相同;若若NSString的赋值来源是NSMutableString时,copy会做深拷贝重新生成一个新的对象,修改赋值来源不会影响NSString的值,但若是strong修饰时,字符串则会随NSMutableString的改变而改变。

接下来我们再说weak:从上图中可知,weak修饰的字符串,一个是通过alloc赋值的,一个是通过stringWithFormat赋值的,这两个赋值方式不同,打印的数据也是不同的。weakString的class为__NSCFString,weakString2的class为__NSCFConstantString,weakString3的class为NSTaggedPointerString,第一个为指针指向字符串的对象,第二个是指针指向的常量,第三个是指针(即指针上就是数据)。通过测试可知,当赋值的字符串小于10个的时候,两种赋值方式在DidAppear都可以打印出来;当赋值的字符串大于等于10个的时候,则通过stringWithFormat赋值的方式,则打印出null。

如有问题,请各位大佬指出!