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

时间:2011-11-06 14:01:07

标签: iphone objective-c alloc

我正在尝试学习目标C,我发现非常奇怪的事情之一就是何时使用alloc以及何时不使用。以这段代码为例:

NSURL *url =[NSURL URLWithString:@"http://www.apple.com"];

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

UIAlert *alert = [[UIAlertView alloc]]

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

2 个答案:

答案 0 :(得分:6)

+alloc的问题在于它会保留其结果,这就是为什么必须与之后调用-release-autorelease进行平衡的原因。为了避免必须在每次使用类时反复输入,API设计人员通常会创建所谓的便利构造函数便捷方法+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 。我不推荐它。

答案 1 :(得分:2)

使用alloc方法创建一个由您拥有的新对象。我的意思是像这样创建它

NSURL *url =[[NSURL allo]initWithString:@"http://www.apple.com"], 你成为这个对象的拥有者。使用后,请说

NSLog ("Url path is %@",url);

您必须释放此对象(网址)

[url release];

这是Objective C中关于内存管理的主要话题之一

你的陈述怎么样,

NSURL *url =[NSURL URLWithString:@"http://www.apple.com"];

我必须说系统会返回一个带字符串的url,但是你并不拥有它,所以你不需要释放它,因为系统会自动释放它(自动向这个对象发送autorelease消息)