Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 什么时候需要分配课程?_Iphone_Objective C_Class_Memory Management - Fatal编程技术网

Iphone 什么时候需要分配课程?

Iphone 什么时候需要分配课程?,iphone,objective-c,class,memory-management,Iphone,Objective C,Class,Memory Management,在我的节目里我有 NSString *stringOne = [NSString stringWithFormat:@"Hello World"]; [variable insertText:stringOne]; 代码运行良好。我知道“stringWithFormat:”方法启动对象,但是alloc发生在哪里?为什么这里不需要它 我可以用NSSound做同样的事情 NSSound *favoriteSong = [NSSound soundNamed:@"Friday"]; [favorit

在我的节目里我有

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];
然后从那里继续下去,以便一切顺利

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

什么时候需要分配课程

您不应该过多地处理类对象,它们都是自动完成的。我真的认为我们谈论的不是同一件事。也许你指的是“类方法返回的对象”,而不是“类”。比如:

什么时候需要分配类方法返回的对象?

看起来更合适

alloc发生在哪里

你回答了,就在这些话之前。它发生在
+stringWithFormat:
方法内部

为什么这里不需要它

在你这边不需要它,因为在图书馆那边已经做过了

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

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



*至少在正常情况下。也许有人可以举个例子。

一些方法,如
soundNamed
分配一个自动释放的对象并返回它。作为一个例子,让我们想象这两种方法的存在:

电话:

NSSound *favoriteSong = [NSSound soundNamed:@"Friday"];
NSSound *favoriteSong = [[NSSound alloc] initWithSoundNamed:@"Friday"];
返回NSSound分配的对象,以@“Friday”初始化。此返回的对象将自动删除

电话:

NSSound *favoriteSong = [NSSound soundNamed:@"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];
}

stringWithFormat
是一个声明为:

+ (id)stringWithFormat:(NSString *)format, ...
请注意字体中的“+”表示类方法。文件规定:

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

但即使这不是必须的,人们也可以正确地写下:

[variable insertText:@"Hello World"];

关于Objective-C可能值得一读。

这些方法被称为便利(class)方法,它们返回一个自动释放的对象。换句话说,
stringWithFormat
实现中的某个地方类似于

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

基本上,
stringWithFormat
分配对象,将其放入自动释放池并返回给您。您可以找到NSString的GNUStep实现

系统负责分配
——您几乎不需要担心这一点。然而,
实例
完全是另一回事。非常感谢。你的答案是最好的。。非常感谢你的兄弟。非常感谢。