[[CAShapeLayer alloc] init] 和 [CAShapeLayer layer] 的区别

Posted

技术标签:

【中文标题】[[CAShapeLayer alloc] init] 和 [CAShapeLayer layer] 的区别【英文标题】:Difference Between [[CAShapeLayer alloc] init] and [CAShapeLayer layer] 【发布时间】:2012-11-10 14:54:30 【问题描述】:

我注意到大多数人在初始化 CAShapeLayer 时使用:

CAShapeLayer *shapeLayer = [CAShapeLayer layer];

而不是使用初始化器:

CAShapeLayer *shapeLayer = [[CAShapeLayer alloc] init];

我想知道使用其中一种有什么特别的区别,或者哪种通常更好?

【问题讨论】:

【参考方案1】:

第一个返回一个自动释放的对象。由于它是自动发布的,因此您不是它的所有者。当自动释放池(它所在的)被释放时,该对象将自动为您释放。

第二个返回一个具有 +1 保留计数的对象。您是该对象的所有者,因此对release 它负责。但是 - 使用 ARC,您可能不需要像我们那样致电 release

相关链接:

    Objective C Method Families Basic Memory Management Rules

【讨论】:

谢谢,我已经意识到内存管理的影响,但不明白为什么使用 CALayers 的人使用 [CALayer 层] 而不是分配新对象。是否用于缓存目的? 使用手动内存管理:由于第一种方法返回 autorelease 对象,该对象将被自动释放,我们通常在单个方法实现中执行此操作。之所以如此,是因为我们不需要再调用release。而如果你做 alloc+init,你需要释放它,对吗?否则,您将在创建对象并且没有释放它时泄漏内存。但是,有了 ARC,这并不重要。 @***Rider。我认为您误解了 [CALayer 层] 的作用。它确实分配/初始化一个新对象——唯一的区别是内存管理效果。 使用 ARC 并没有实际的区别,因为 ARC 处理了您以前不得不担心的所有内存管理任务。无论您以哪种方式创建图层,您都不会需要在 ARC 下向其发送 releaseautorelease。不仅如此,即使你想也做不到——这两条消息在 ARC 下都是非法的。

以上是关于[[CAShapeLayer alloc] init] 和 [CAShapeLayer layer] 的区别的主要内容,如果未能解决你的问题,请参考以下文章

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 1099 bytes)

OC知识点alloc 和init

关于CAShapeLayer

CAShapeLayer的使用

已解决Android ADT中增大AVD内存后无法启动:emulator failed to allocate memory

CAShapeLayer