目标C何时使用alloc以及何时不使用

gco*_*828 5 iphone objective-c alloc

我正在尝试学习目标C,其中一个我觉得非常奇怪的事情就是何时使用alloc以及何时不使用.以这段代码为例:

NSURL *url =[NSURL URLWithString:@"http://www.apple.com"];
Run Code Online (Sandbox Code Playgroud)

为什么你不必先做这样的事情来先分配它?

UIAlert *alert = [[UIAlertView alloc]]
Run Code Online (Sandbox Code Playgroud)

我确信在目标C中我只缺少一些基本的东西,但奇怪的是我很难找到一个没有张贴的解释.谢谢!!

Jon*_*pan 6

问题+alloc在于它保留了结果,这就是它必须与调用-release-autorelease稍后调整的原因.为了避免每次使用类时都要反复输入,API设计人员通常会创建所谓的便利构造函数便捷方法.+URLWithString:是其中之一,内部看起来像这样:

+ (id)URLWithString: (NSString *)str {
    return [[[self alloc] initWithString: str] autorelease];
}
Run Code Online (Sandbox Code Playgroud)

所以+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;
}
Run Code Online (Sandbox Code Playgroud)

(它实际上比这复杂一点,但它应该足够了.)注意,它+alloc被定义为所有对象的一部分NSObject,而不是所有对象的一部分.可可内存管理,有+alloc,-init,-retain,-release,等并不总是Objective-C的一部分,和对象可以创建不使用它.

如果你知道正确的咒语,你实际上可以在不调用的+alloc情况下创建类的实例.我不推荐它.