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有技巧并且可以尽早从自动释放池中删除对象,因此您可能首先认为该对象将存活更长时间然后它不会…
>弱引用:在前两个子弹之后,您应该猜测,因为您可能不知道对象何时被释放,如果有的话,那么当弱引用被取消时您可能不知道.试想“很快”.
>优化:编译器可以做的优化有一些余地,虽然保留了程序的正确语义,但可能会改变对象的生命周期.
如果您确实希望运行这些调查,那么如果(a)使用您自己的类类型,而不是库中的任何类型,并且(b)使用@autoreleasepool {…}块来限制auto的生命周期,您可能会更进一步.发布的对象.
作为一个例子,当我在编译器上运行你的代码时,我没有得到(null),但是将第一个赋值更改为string0 = text.lowercaseString.mutableCopy确实产生了一个…找出为什么留下作为一个行使…
有一个探究的头脑和探索,这是好的,但要为非显而易见的人做好准备!
HTH
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。