【问题标题】:Xcode debug and NSArray memory management ProblemXcode 调试和 NSArray 内存管理问题
【发布时间】:2011-02-13 08:20:24
【问题描述】:

我根据 Aaron Hillegass 的 COCOA PROGRAMMING 书(第 6 章)编写了一个应用程序。

该应用程序显示语音合成器的可用声音。

表格视图的init和delegate方法如下:

- (id)init
{
    [super init];
    NSLog(@"init");
    speechSynth = [[NSSpeechSynthesizer alloc] init];
    [speechSynth setDelegate:self];
    availableVoices = [[NSSpeechSynthesizer availableVoices] retain];
    return self;
}


- (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn*)aTableColumn row:(NSInteger)rowIndex
{
    NSString * aVoice = [availableVoices objectAtIndex:rowIndex];
    NSDictionary *voiceDict = [NSSpeechSynthesizer attributesForVoice:aVoice];
    return [voiceDict objectForKey:NSVoiceName];
}

我有关于这一行的问题 1:

availableVoices = [[NSSpeechSynthesizer availableVoices] **retain**];

为什么要保留?我尝试不保留,弹出窗口,但是我在窗口上移动鼠标,程序被丢弃:

(gdb) 继续 2011-02-13 15:57:37.671 SpeakLine[4384:80f] ** -[CFArray objectAtIndex:]: 消息发送到释放的实例 0x187e20*

问题 2:

我调试这个程序,即使我没有写retain,availableVoices也可以,但是Xcode调试器只显示9个内容,为什么?怎样才能看到数组的所有内容?

This is the snapshot

问题 3:

为什么程序在期中而不是一开始就崩溃了? NSSpeechSynthesizer 的内容是什么时候发布的?

【问题讨论】:

    标签: objective-c cocoa xcode


    【解决方案1】:

    请注意,您的 init 模式是错误的。

    应该是:

    - (void) init
    {
       self = [super init];
       if (self) {
          ... init stuff here ...
       }
       return self;
    }
    

    availableVoices = [[NSSpeechSynthesizer availableVoices] retain];
    

    为什么要保留?我试过没有保留, 窗口弹出,但我移动 鼠标在窗口上,程序 垃圾:

    这在Objective-C Memory Management Guide 中有介绍;简而言之,如果您不新建、保留、分配或复制一个对象,那么您必须保留它才能保留它。

    我调试了这个程序,即使我没有 写retain,availableVoices也可以 可以使用,但仅限 Xcode 调试器 显示九个内容,为什么?怎么能 观察数组的所有内容?

    不清楚你在问什么。应该超过9个吗?它应该改变吗?请注意,一旦对象被释放,消息传递时的行为是未定义的。它有时会工作,直到内存被覆盖。

    最后,不清楚您在#3 中的要求是什么。语音合成器好像根本没有发布。

    【讨论】:

    • 非常感谢。对于#2。我拍了一张快照标记九个值
    【解决方案2】:

    问题 1

    当您收到一个已自动释放的对象以获取该对象的所有权时,您需要保留。当你完成对象后,你需要相应地释放它。

    问题 2

    因为您收到了一个您尚未拥有所有权的对象,所以结果可能无法预测。

    问题 3

    一个自动释放的对象最终会被系统释放,因为你没有保留它会在某一时刻消失,通常是在释放 nsautoreleasepool 时。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-06
      • 2011-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多