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

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

概述第一个代码和输出: NSString *text = @"Sunny";__weak NSString *string0 = text.lowercaseString;__weak NSString *string1;string1 = text.lowercaseString;NSLog(@"%@, %@", string0, string1); 输出: (null), sunny 但 第一个代码和输出:
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在第一种情况下有所不同?
>为什么第二种情况的输出与第一种情况不同?

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

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

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

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

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

HTH

总结

以上是内存溢出为你收集整理的ios – ObjectiveC:使用NSString和__weak与ARC时的奇怪行为全部内容,希望文章能够帮你解决ios – ObjectiveC:使用NSString和__weak与ARC时的奇怪行为所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1107360.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-28
下一篇2022-05-28

发表评论

登录后才能评论

评论列表(0条)

    保存