ios – ObjectiveC:使用NSString和__weak与ARC时的奇怪行为

前端之家收集整理的这篇文章主要介绍了ios – ObjectiveC:使用NSString和__weak与ARC时的奇怪行为前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
第一个代码输出
NSString *text = @"Sunny";
__weak NSString *string0 = text.lowercaseString;
__weak NSString *string1;
string1 = text.lowercaseString;

NSLog(@"%@,%@",string0,string1);

输出

(null),sunny

但是在我将text1的声明移到文本上方后,输出就不同了.这是代码

__weak NSString *string1;
NSString *text = @"Sunny";
__weak NSString *string0 = text.lowercaseString;
string1 = text.lowercaseString;

NSLog(@"%@,string1);

输出

sunny,sunny

我对不同的输出很困惑:

>为什么string0和string1在第一种情况下有所不同?
>为什么第二种情况的输出与第一种情况不同?

@H_502_22@解决方法
试图弄清楚对象何时被释放或者弱引用是否具有挑战性,并且通常并不能真正帮助理解.以下是您可以看到与预期不同的结果的一些原因:

> NSString:在进行这类调查时最好不要使用此类型.字符串文字是不朽的,它们不会被收集,即使你不期望它也可能有一个字符串文字.
>自动释放池:自动释放池实际上是ARC之前的宿醉,但它仍然存在,并且许多方法返回自动释放的对象.这意味着许多物体的寿命会超出您的预期,但不会太长.但是,ARC有技巧并且可以尽早从自动释放池中删除对象,因此您可能首先认为该对象将存活更长时间然后它不会…
>弱引用:在前两个子弹之后,您应该猜测,因为您可能不知道对象何时被释放,如果有的话,那么当弱引用被取消时您可能不知道.试想“很快”.
>优化:编译器可以做的优化有一些余地,虽然保留了程序的正确语义,但可能会改变对象的生命周期.

如果您确实希望运行这些调查,那么如果(a)使用您自己的类类型,而不是库中的任何类型,并且(b)使用@autoreleasepool {…}块来限制auto的生命周期,您可能会更进一步.发布的对象.

作为一个例子,当我在编译器上运行你的代码时,我没有得到(null),但是将第一个赋值更改为string0 = text.lowercaseString.mutableCopy确实产生了一个…找出为什么留下作为一个行使…

有一个探究的头脑和探索,这是好的,但要为非显而易见的人做好准备!

HTH

猜你在找的iOS相关文章