weak的特点是不会使引用对象的引用计数加一,即不持有对象,在对象为nil时,自身也会为nil.
但是在字符串这里有一点区别
weak修饰的属性引用了一个常规的对象,当这个对象被释放时, weak对象也会被释放.
但是在字符串中似乎有些不一样:
//有两个属性
@property (nonatomic, copy) NSString *imCopyStr;
@property (nonatomic, weak) NSString *str1;
//使用这种方式初始化
_imCopyStr = [[NSString alloc] initWithUTF8String:"hello World"];
_str1 = _imCopyStr;
_imCopyStr = nil;
NSLog(@"weak 的指针值: %@",_str1);
打印的的结果
weak 的指针值: (null)
对象置为nil了, weak修饰的属性也被释放了.
但换一种初始化方式
_imCopyStr = @"hello word";
_str1 = _imCopyStr;
_imCopyStr = nil;
NSLog(@"weak 的指针值: %@",_str1);
打印的结果是:
weak 的指针值: hello word
weak修饰的属性并没有被释放.
我记得以前在哪里看过, 说字符串内部被优化过. 从这看出,不同的初始化方法,对结果是有影响的.
但是内部的原因暂时还是不知道.
2020 /04/15 更新
字符串初始化的三种方式:
1. 字面量形式直接赋值
2. 类方法初始化
3. 实例方法初始化
1和3 这两种方式初始化的字符串是放在数据段.
第2种初始化方式, 字符<9 时, 是放在指针中,在栈区,因为用到了tagged pointer (指针优化);
>9 时, 数据放在堆区.