【问题标题】:When Do classes need to be allocated?什么时候需要分配课程?
【发布时间】:2011-11-15 23:30:17
【问题描述】:

在我的程序中,我有

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

并且代码运行良好。我知道 'stringWithFormat:' 方法会启动对象,但分配发生在哪里?为什么这里不需要?

我可以用 NSSound 做同样的事情

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

这也将运行。我知道 'soundNamed:' 返回并启动对象,但从未分配过 NSSound。

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

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

然后从那里继续以使一切正常。

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

【问题讨论】:

  • 系统负责分配classes——你很少需要担心这个。但是,instances 完全是另一回事。

标签: iphone objective-c class memory-management


【解决方案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];
}

【讨论】:

  • 非常感谢。你的回答是最好的。非常感谢兄弟。谢谢你..
【解决方案2】:

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

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

注意字体中的“+”,它表示一个类方法。文件指出:

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

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

[variable insertText:@"Hello World"];

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

【讨论】:

    【解决方案3】:

    什么时候需要分配课程?

    你不应该过多地关心类对象,这一切都是自动完成的。我真的认为我们说的不是同一件事。也许您的意思是“类方法返回的对象”而不是“类”。比如:

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

    看起来更合适。

    分配发生在哪里?

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

    为什么这里不需要它?

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

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

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


    * 至少在正常情况下。也许有人可以引用一个极端案例。

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 2022-11-28
          • 2018-11-11
          • 1970-01-01
          • 2012-09-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-12-08
          • 2018-12-10
          相关资源
          最近更新 更多