+alloc
的问题是它保留了它的结果,这就是为什么它必须在稍后调用-release
或-autorelease
来平衡。为了避免必须在每次使用类时反复输入,API设计者通常创建所谓的便利构造器或1便利方法。 +URLWithString:
就是其中之一,并在内部它看起来像这样:
+ (id)URLWithString: (NSString *)str {
return [[[self alloc] initWithString: str] autorelease];
}
所以+alloc
获取调用为你,所以是-autorelease
。
背景
有两大种在Objective-C的方法:类方法和实例方法。类方法被发送到类本身,并且不需要创建该类的实例。实例方法被发送到实例并可以访问实例占用的内存。类方法以+
开头;实例方法与-
。
+alloc
是一种类方法。它不是具有特定对象创建能力的魔法。所有在内部做的是一样的东西:
+ (id)alloc {
id result = malloc(class_getInstanceSize(self));
if (result) {
memset(result, 0, class_getInstanceSize(self));
result->isa = self;
result->retainCount = 1;
}
return result;
}
(它实际上比这更复杂一点,但它应该在这里足够了。)请注意+alloc
被定义为NSObject
,而不是所有对象的一部分。可可内存管理,有+alloc
,-init
,-retain
,-release
等并不总是Objective-C的一部分,并且可以创建不使用它的对象。
实际上,你可以无需调用+alloc
如果你知道正确的咒语,创建一个类的实例。我不会推荐它。
@jrturton:正如我所说的,是的,我对它没有什么意义,我通常在这里得到很好的解释,所以我认为有人可以给出一个很好的答案。苹果开发者文档是可怕的,并且被称为是可怕的。请回答我的问题时,请给出实际答案。我会很感激。 – gcoleman0828
在你的问题中没有任何地方提到你阅读过文档或你有问题的部分。不要太防守! – jrturton