何时使用alloc

时间:2015-03-24 11:08:27

标签: ios objective-c

我曾尝试在旧帖子中挖掘,但它们已经过时且岁月,所以我担心由于引入ARC等原因可能会发生变化。

主要是我在查看一些在数组上使用alloc的相当新的代码,它在头文件中被声明为属性。我在想,我通常不这样做,一切都很顺利。但后来我想到了UIButton和UILabel,它必须调用alloc,否则当你想要它们时它们不会被添加到视图中。什么时候需要它的粗略指导方针。我认为任何对象都需要这个,但是我刚才描述的数组与按钮/标签之类的东西让我想知道这背后的原因是什么。

提前致谢

4 个答案:

答案 0 :(得分:2)

这完全取决于框架中使用的实际对象。然而,真正的好消息是Apple非常一致。如果您在任何地方发送包含“Alloc”的消息,则您有责任确保该消息已被释放。

Here's a super document on it from Apple.

答案 1 :(得分:1)

如果您自己创建对象,则始终使用alloc。 这意味着发送alloc通常后跟init方法。

有时看起来并非总是如此,因为许多类都有方便的构造函数,它们会向您返回已分配和初始化的对象。 但是仍然有alloc和init被调用来创建对象。 它刚刚由系统为您完成。 但方便的构造函数和手动创建对象之间的区别对于ARC来说并不陌生,它始终存在。

自行创建NSArray的示例:

[[NSArray alloc]initWithObjects:@"Test", nil];

并且NSArray在这里有一个方便的构造函数,例如:

[NSArray arrayWithObjects:@"Test", nil];

如果您使用ARC,则没有真正的区别。 如果没有ARC,方便构造函数返回的对象仍然会被自动释放,而手动分配的对象必须在稍后释放(或者你必须在init之后添加自动释放)。

所以主要区别在于船主: 在手动创建的示例中,对象属于您,因此您有责任在您不再需要它之后进行清理。

答案 2 :(得分:1)

如果在.xib中声明了某些内容,则会自动为您分配。只是使用它。如果要在代码中创建视图,则必须先将其分配。如果您有属性NSArray / NSMutableArray等,您可能正在执行以下操作之一:

_array = [NSArray new];
_array = [[NSArray alloc] init];
_array = [NSArray arrayWithObjects: values count:2];
_array = @ ["ABC", "xyz"];

等 所以如果你使用这些方法中的任何一种,你实际上是在分配它。

答案 3 :(得分:0)

我真的不明白,是什么

  

当您需要时,它们不会添加到视图中。

意味着,但这是故事:

使用+alloc分配每个对象。说实话,它是+allocWithZone:,但这在这个地方没有任何意义。

您必须发送给新创建的实例对象的第一条消息(记住:您向类对象发送了+alloc)是一条初始化消息,类似于init…。要将它们组合在一起,您将找到以下代码:

… [[TheClass alloc] init…] …;

因为它很无聊,所以有new个分配器。他们将这些信息合而为一:

… [TheClass new…] …;

(这对类实现者也有一些优势,但这对您来说是透明的。可以将其视为发送+alloc-init…。)

在早些时候,由于某些原因,下一步发送自动发布消息是个好主意:

… [[[TheClass alloc] init…] autorelease] …;

这已经整合到便利分配器中了:

… [TheClass theClass…] …

这是您在阅读旧代码时大多数时间都能找到的内容。使用ARC,您不再需要便利分配器:没有自动释放。所以便利分配器没有理由了。但是我们有多年的MRR,还有很多便利分配器。 (现在称为工厂方法,但CA只是这些方法的一个子集。你不需要关心它的一个子集。它与ARC一起消失了。)因为有很多CA,所以仍然使用它们。 (并且它们存在性能问题。现在我只编写new分配器,它具有CA的优点,但不具有自动释放的缺点。)

简而言之:您根本看不到有时会使用+alloc

相关问题