Ios 何时使用alloc

Ios 何时使用alloc,ios,objective-c,Ios,Objective C,我试着在旧的帖子里翻来翻去,但它们有点过时了,而且已经过时了,所以我担心事情可能会因为ARC的引入而改变 我主要关注的是一些相当新的代码,它们在数组上使用alloc,数组在头中声明为属性。我在想,我通常不会这么做,一切都很顺利。但后来我想到了UIButton和UILabel,例如,它们必须调用alloc,否则它们不会在需要时添加到视图中。是否有任何粗略的指导方针来确定何时实际需要它。我认为任何对象都需要这个,但是我刚才描述的数组与按钮/标签的对比让我想知道这背后的原因是什么 提前感谢这完全取决于

我试着在旧的帖子里翻来翻去,但它们有点过时了,而且已经过时了,所以我担心事情可能会因为ARC的引入而改变

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


提前感谢

这完全取决于框架中使用的实际对象。不过,真正好的消息是,苹果的表现非常稳定。如果您在任何地方发送包含“Alloc”的消息,您有责任确保该消息已被发布


这100%取决于框架中使用的实际对象。不过,真正好的消息是,苹果的表现非常稳定。如果您在任何地方发送包含“Alloc”的消息,您有责任确保该消息已被发布


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

有时可能看起来情况并非总是如此,因为许多类都有方便的构造函数,可以将已分配和初始化的对象返回给您。 但是仍然需要调用alloc和init来创建对象。 这是系统为你做的。 但是,方便的构造函数和手动创建对象之间的区别对于ARC来说并不新鲜,它一直存在

您自己创建NSArray的示例:

[[NSArray alloc]initWithObjects:@"Test", nil];
由于NSArray在这里有一个方便的构造函数,示例如下:

[NSArray arrayWithObjects:@"Test", nil];
如果使用ARC,则没有真正的区别。 如果没有ARC,方便的构造函数返回的对象仍然会自动释放,而手动分配的对象必须在稍后由您释放(或者您必须在初始化之后添加自动释放)

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

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

有时可能看起来情况并非总是如此,因为许多类都有方便的构造函数,可以将已分配和初始化的对象返回给您。 但是仍然需要调用alloc和init来创建对象。 这是系统为你做的。 但是,方便的构造函数和手动创建对象之间的区别对于ARC来说并不新鲜,它一直存在

您自己创建NSArray的示例:

[[NSArray alloc]initWithObjects:@"Test", nil];
由于NSArray在这里有一个方便的构造函数,示例如下:

[NSArray arrayWithObjects:@"Test", nil];
如果使用ARC,则没有真正的区别。 如果没有ARC,方便的构造函数返回的对象仍然会自动释放,而手动分配的对象必须在稍后由您释放(或者您必须在初始化之后添加自动释放)

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

如果在.xib中声明了某个对象,则该对象将自动分配给您。就用它吧。如果在代码中创建视图,则必须首先分配它。如果您有一个属性NSArray/NSMutableArray等,您可能正在执行以下操作之一:

_array = [NSArray new];
_array = [[NSArray alloc] init];
_array = [NSArray arrayWithObjects: values count:2];
_array = @ ["ABC", "xyz"];
等等,,
因此,如果您使用这些方法中的任何一种,您实际上是在分配它。

如果在.xib中声明了某个内容,那么它将自动分配给您。就用它吧。如果在代码中创建视图,则必须首先分配它。如果您有一个属性NSArray/NSMutableArray等,您可能正在执行以下操作之一:

_array = [NSArray new];
_array = [[NSArray alloc] init];
_array = [NSArray arrayWithObjects: values count:2];
_array = @ ["ABC", "xyz"];
等等,,
因此,如果您使用这些方法中的任何一种,您实际上是在分配它。

我真的不明白,什么

如果需要,它们不会添加到视图中

意思是,但故事是这样的:

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

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

… [[TheClass alloc] init…] …;
因为打字很无聊,所以有
新的
分配器。他们将这些信息整合成一个:

… [TheClass new…] …;
(这对类实现者也有一些好处,但对您来说是透明的。可以将其视为发送
+alloc
-init…

在早期,出于某些原因,最好在下一步向其发送自动释放消息:

… [[[TheClass alloc] init…] autorelease] …;
这是为了方便分配器:

… [TheClass theClass…] …
这是您在阅读旧代码时发现的大多数情况。使用ARC,您不再需要方便的分配器:没有自动释放。因此,没有理由再使用方便的分配器了。但是我们有MRR已经很多年了,仍然有很多便利分配器。(现在称为工厂方法,但CA只是其中的一个子集。这是一个你不必关心的子集。它随ARC一起消失了。)因为有那么多CA,人们仍然使用它们。(它们存在一个性能问题。现在我只编写
新的
分配器,它具有CA的优点,但没有autorelease的缺点。)

长话短说:有时候你根本看不到
+alloc