话不多说,先上代码
@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。
如有问题,请各位大佬指出!