2011-11-06 61 views
5

我想学习目标C,我发现很奇怪的事情之一是什么时候使用alloc,什么时候不使用。举例来说,这段代码:目标C什么时候使用alloc和什么时候不到

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

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

UIAlert *alert = [[UIAlertView alloc]] 

我敢肯定有刚刚在Objective C的一些基本的东西我失踪,但奇怪的是我有一个困难时期,而无需缴纳找到一个解释。谢谢!!

+0

@jrturton:正如我所说的,是的,我对它没有什么意义,我通常在这里得到很好的解释,所以我认为有人可以给出一个很好的答案。苹果开发者文档是可怕的,并且被称为是可怕的。请回答我的问题时,请给出实际答案。我会很感激。 – gcoleman0828

+0

在你的问题中没有任何地方提到你阅读过文档或你有问题的部分。不要太防守! – jrturton

回答

6

+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如果你知道正确的咒语,创建一个类的实例。我不会推荐它。

+0

谢谢你的详细解答。这让我更容易了解我所困惑的事情。再次感谢! – gcoleman0828

2

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

NSURL *url =[[NSURL allo]initWithString:@"http://www.apple.com"], 你成为此对象的所有者。你使用它之后,可以说

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

必须释放这个对象(URL)

[url release]; 

这是关于目标C

那你statment内存管理主要议题之一,

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

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

+1

@devcode,好吧,这是有道理的,但我想那么我的下一个问题是,为什么要关心,如果你“拥有它”为什么不总是不使用alloc,然后从来没有担心释放它?这会给你买什么? – gcoleman0828

+0

因为您拥有自己的对象,您可以控制应用程序使用的内存。你知道在使用这个对象之后,你应该使用方便的构造函数来释放它(如你所做的那样),系统并不立即释放该对象,所以你的应用仍然保留一块不必要的内存。使用alloc是最好的选择 – 2011-11-06 14:38:28

相关问题