何时需要分配Do类?

时间:2011-11-15 23:30:18

标签: iphone objective-c class memory-management

在我的节目中我有

NSString *stringOne = [NSString stringWithFormat:@"Hello World"];
[variable insertText:stringOne];

并且代码运行正常。我知道'stringWithFormat:'方法启动对象,但是alloc在哪里发生?为什么这里不需要它?

我可以用NSSound

做同样的事情
NSSound *favoriteSong = [NSSound soundNamed:@"Friday"];
[favoriteSong play];

这也会运行。我知道'soundNamed:'返回&启动对象但从未分配NSSound。

我一直认为我必须做以下事情。

NSSound *favoriteSong = [[NSSound alloc]initWithBlablanla];

然后继续从那里开始工作。

我要问的是,分配在哪里发生?

5 个答案:

答案 0 :(得分:1)

某些方法(如soundNamed)会分配一个自动释放的对象并将其返回。作为一个例子,我们假设存在这两种方法:

致电:

NSSound *favoriteSong = [NSSound soundNamed:@"Friday"];

返回一个NSSound分配的对象,以@“Friday”为中心。此返回的对象是自动释放的。

致电:

NSSound *favoriteSong = [[NSSound alloc] initWithSoundNamed:@"Friday"];

返回一个NSSound分配的对象,以@“Friday”为中心。保留此返回的对象,并且必须取消分配。

这两个电话会做同样的事情:

NSSound *favoriteSong = [NSSound soundNamed:@"Friday"];
NSSound *favoriteSong = [[[NSSound alloc] initWithSoundNamed:@"Friday"] autorelease];

作为一种捷径,soundNamed类似于:

+ (id) soundNamed:(NSString*)name
{
    NSSound* aSound = [[NSSound alloc] initWithSoundNamed:name];
    if (!aSound) return nil;

    return [aSound autorelease];
}

答案 1 :(得分:1)

stringWithFormat是一个connivence类方法,声明为:

+ (id)stringWithFormat:(NSString *)format, ...

注意字体中的“+”,它指定一个类方法。文件说明:

返回使用给定格式字符串作为模板创建的字符串,其余的参数值将替换为该模板。

但即使这不是必要的,也可以正确地写一下:

[variable insertText:@"Hello World"];

在Objective-C上阅读Apple's documentation可能是值得的。

答案 2 :(得分:0)

  

什么时候需要分配课程?

你不应该过多地打扰类对象,它们都是自动完成的。我真的认为我们不是在谈论同样的事情。也许你的意思是“类方法返回的对象”而不是“类”。类似的东西:

何时需要分配类方法返回的对象?

看起来更合适。

  

分配发生在哪里?

你在这些话之前回答了这个问题。它发生在+stringWithFormat:方法中。

  

为什么这里不需要它?

这不需要你,因为它已经在图书馆方面完成了。

  

我知道'soundNamed:'返回&启动对象但从未分配NSSound。

当然是。如果存在,则分配*。同样,它是在+soundNamed:方法中分配的。


*至少以正常方式。也许有人可以引用一个角落案例。

答案 3 :(得分:0)

这些方法称为便捷(class)方法,它返回一个自动释放的对象。换句话说,stringWithFormat的实现中某处与

类似
NSString * string = [[[NSString alloc] init] autorelease];

答案 4 :(得分:0)

基本上stringWithFormat分配对象,将其放入自动回收池并将其返回给您。您可以找到NSString here

的GNUStep实现