[[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 下向其发送 release
或 autorelease
。不仅如此,即使你想也做不到——这两条消息在 ARC 下都是非法的。以上是关于[[CAShapeLayer alloc] init] 和 [CAShapeLayer layer] 的区别的主要内容,如果未能解决你的问题,请参考以下文章
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 1099 bytes)
已解决Android ADT中增大AVD内存后无法启动:emulator failed to allocate memory