weak与字符串

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 时, 数据放在堆区.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值