gpt4 book ai didi

ios - CALayer 层未自动释放

转载 作者:行者123 更新时间:2023-11-28 19:54:53 27 4
gpt4 key购买 nike

我有一个关于以下代码的问题:

@interface ViewController ()
@property (nonatomic, weak) CALayer *someLayer;
@end

@implementation ViewController

- (void)viewDidLoad {
[super viewDidLoad];

self.someLayer = [CALayer layer];
self.someLayer.frame = CGRectMake(10.0, 10.0, 100.0, 100.0);
self.someLayer.backgroundColor = [UIColor yellowColor].CGColor;
[self.view.layer addSublayer:self.someLayer];
}
@end

根据我的理解,[CALayer layer] 应该返回一个自动释放的值,只要方法调用正在进行,它就应该存在。然后它被弱属性 someLayer 引用。由于该层后来由 View 的层保留,因此一切都应该没问题并且该层应该出现。它的作用,但仅限于 < iPhone 5S 的设备。至少当我在模拟器中运行代码时。

在较新的设备上,图层不会显示。将 property 属性更改为 strong 可以解决问题,但我想知道为什么该层会立即释放。

您是否有任何提示我可以调试此行为以查看发生了什么变化?

谢谢!

更新:

使用 self.someLayer = [CALayer [alloc]] init] 给出适当的警告 Xcode warning

这是我理解的,因为在使用 alloc 时,该值归调用者所有。由于所有者不保留值(value),因此没有强有力的引用。像 layer 这样的便利初始化器应该自动释放一个保留值,在自动释放池被耗尽之前应该可以访问它。在这种情况下,Xcode 也没有警告。

更新#2:越来越有意思了...我在装有 iOS 8 的 iPhone 6 和装有 iOS 6 的 iPhone 4 上测试了代码。该层将不会显示在两者上...

但是

如果我在创建行设置断点并越过它,该层将在模拟器

enter image description here

我如何检查幕后发生的事情?

更新 #3 和更多解释:

Big Nerd Ranch 上有一篇关于此行为的精彩文章 ARC Gotcha - Unexpectedly Short Lifetimes

以上代码的反汇编显示了 ARC 如何插入 _objc_retainAutoreleasedReturnValue

来自文章:

you can see ARC's "avoid the autorelease pool" optimization is being used: if a method returns an autoreleased object, and the caller doesn't otherwise need to hang on to it, ARC can avoid the trip to the autorelease pool. The method will return a retained object and objc_retainAutoreleasedReturnValue will dispose of it.

所以,为了避免这个问题,要么声明一个强属性(正如我上面提到的),要么看看@graver 的回答。

最佳答案

因为您的 someLayer 属性很弱,所以没有什么可以保持对您的层的强引用。您应该像这样更改代码:

...
CALayer *layer = [CALayer layer]; // by default layer this is __strong, so layer holds a strong reference until the end of the scope
[self.view.layer addSublayer:layer]; // Now self.view.layer retains the layer
self.somelayer = layer; // weak reference it

self.someLayer.frame = CGRectMake(10.0, 10.0, 100.0, 100.0);
self.someLayer.backgroundColor = [UIColor yellowColor].CGColor;

// In the end of the scope layer would be released, but it's also retained by self.view.layer and weak referenced by self.someLayer
...

关于ios - CALayer 层未自动释放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27062135/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com