【问题标题】:Incorrect decrement of reference count in analyzer [duplicate]分析器中引用计数的错误减少[重复]
【发布时间】:2012-03-14 00:31:35
【问题描述】:

可能重复:
How do I use NSTimer
Decrement Issue

我真的很难摆脱以下警告:

此时不属于调用者的对象的引用计数递减不正确。

代码编译良好,应用程序似乎运行良好。基本上我正在尝试创建一个类的对象以在按下按钮时播放短音频剪辑。我创建了一个类来播放文件,对象以字符串形式传递文件名。

代码如下:

- (IBAction) playKick 
{        
    PlayAudio *thisPlayAudio= [[[PlayAudio alloc] init] playFile:(@"RockSnare")];
    [thisPlayAudio release];
}

我已阅读其他帖子,任何帮助将不胜感激!

【问题讨论】:

  • 您好,感谢您的回复!我已经尝试使用此代码自动释放 - (IBAction) playKick { PlayAudio *thisPlayAudio = [[[[PlayAudio alloc] init] playFile:(@"file")] autorelease]; } 但随后我收到“未使用变量”警告,“分析器”警告仍然没有出现!
  • 这段代码看起来不错(如果写得有点不合常规并且可能依赖于实现细节)。你确定问题出在这个方法上吗?警告指向哪一行?
  • 这个问题他好像问了两次。
  • 显示 playFile 方法的代码。我猜它可能会返回一个自动释放的对象,而不是返回您正在实例化的 PayAudio 类的实例。如果是这样的话,你就不会释放你认为你正在释放的东西。我认为看到这样的代码是不寻常的。我建议将 alloc/init 与 playFile 方法调用分开。更明确地处理释放实例化对象。

标签: objective-c xcode ios4


【解决方案1】:

我必须查看PlayAudio 的类定义,但怀疑playFile 方法是否返回其PlayAudio 实例。你可能想要这个:

PlayAudio *thisPlayAudio = [[PlayAudio alloc] init];
[thisPlayAudio playFile:(@"RockSnare")];
[thisPlayAudio release];

【讨论】:

    【解决方案2】:

    也许这会有所帮助:

    - (IBAction) playKick {
        PlayAudio *thisPlayAudio= [[PlayAudio alloc] init];
        [thisPlayAudio playFile:(@"RockSnare")];
        [thisPlayAudio release];
    }
    

    这将完成创建对象并将其分配给 thisPlayAudio,然后播放音频。您将 thisPlayAudio 设置为 playFile 调用的结果。

    【讨论】:

    • 大家好,非常感谢您抽出宝贵时间回复!我真的很感激。对不起,我两次发布了这个问题。我不确定它最初是否正确发布。感谢阿尔莫!以上工作!我可能会在走路之前尝试跑步!祝大家好。马丁
    • 该问题似乎已与另一个问题合并,因此您可能希望通过单击复选标记来选择最有帮助的答案。现在您知道系统在下次需要帮助时如何工作。 :)
    【解决方案3】:

    playFile: 方法的返回类型是什么?你确定它返回你调用它的同一个对象吗?

    也许你的代码应该是:

    PlayAudio *thisPlayAudio= [[PlayAudio alloc] init];
    [thisPlaysAudio playFile:@"RockSnare"];
    [thisPlaysAudio release];
    

    甚至

    [[[[PlayAudio alloc] init] autorelease] playFile:(@"RockSnare")];
    

    【讨论】:

      【解决方案4】:

      您试图在创建后立即释放对象。可能,您在 playFile 方法中也做错了。而且您的播放器不会播放任何文件,因为您在一个范围内创建和删除它。试试这个:

      PlayAudio *thisPlayAudio = nil;
      - (IBAction) playKick {
          if (thisPlayAudio){
            [thisPlayAudio release]; thisPlayAudio = nil;
          }
          thisPlayAudio= [[PlayAudio alloc] init] autorelease];
          [thisPlayAudio playFile:(@"RockSnare")];
      }
      

      【讨论】:

      • 嘿,非常感谢您的帮助!我现在已经整理好了!
      猜你喜欢
      • 1970-01-01
      • 2011-09-08
      • 2023-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-04
      • 1970-01-01
      相关资源
      最近更新 更多