在我的节目中我有
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];
然后继续从那里开始工作。
我要问的是,分配在哪里发生?
答案 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