1

很抱歉这里有很多关于这个问题的帖子,但我在这里取得了进展。

我有一个回调函数,它位于 C 中,并在到达新缓冲区时被调用。

我在这里被告知不要在那个回调中做任何事情,不要做 malloc 或任何事情。

现在我想将我的新缓冲区发送到另一个类(这将创建一个圆形缓冲区并保存许多缓冲区)。

但是,我没有得到的基本信息是,如果我从回调中调用另一个函数 - 它与在其中执行它相同 - 因为在该函数中我执行 DSP 并且它需要时间,所以它与执行它相同在那个回调中-因为它是串行的。

froof:我正在将数据发送到另一个类中的另一个函数,它没问题,但如果我尝试NSLOG在那里,我又遇到了这个内存泄漏。

这是我回调中调用的另一个类:

    - (id)init 
    {
        self = [super init];
        if (self)

        {
            data = malloc (sizeof(SInt16) * 4000);


        }
        return self;
    }

 -(void)sendNewBuffer:(SInt16*)buffer
    {

        data=buffer;

        NSLog(@"data arrived size is : %lu",sizeof(data));
        for(int i=0; i<sizeof(data);i++)
        {
            NSLog(@"%d",data[i]);
        }

    }

只有在 时comment the log,它才能在没有内存泄漏的情况下工作。这意味着回调正在等待!

我将如何在其他地方并行处理这些数据?我现在为此花了一个星期。

谢谢。

4

3 回答 3

1

我建议你阅读 C 教程。您的代码至少存在两个问题,我们无法真正帮助您解决:

  • data=buffer;: 这会泄漏data. 您需要将其复制到数据(memcpy)或首先释放内存(free)然后保留指针......除非缓冲区在回调后超出范围,在这种情况下,您唯一的选择是复制
  • sizeof(data): 这个不行。data是一个指针;它不知道它所指向的数据量

第二个意味着你不能正确地实现回调,至少在没有更多信息的情况下是这样。(缓冲区要么有一些数据量的指示,要么是一个恒定的大小。)

于 2012-04-30T16:24:37.980 回答
1

在 NSLog 中使用诸如 NSString 之类的 Objective-C 对象时,内存泄漏的一种可能性是这些对象可能是自动释放的(或者可能是内部使用的自动释放对象)。

您的回调可能会从不同的线程调用。您可以通过在回调中放置断点并在调试器中查看这是主线程还是辅助线程来确认这一点。

任何辅助线程都必须有自己的 AutoRelease 池。系统会自动为主线程创建一个,但如果要创建辅助线程,则必须显式创建一个。

此外,不在回调中分配内容的一个原因通常是为了性能。通常需要将回调保持在最低限度以避免阻塞调用它的线程。

于 2012-04-30T16:18:30.323 回答
0

如果我不得不猜测(我想我会猜测)回调可能是在中断上下文中调用的,因此 malloc 等可能是致命的。我要做的是将数据复制(即 memcpy)到缓冲区,并安排/信号处理代码稍后运行(例如,使用条件变量、runloop 源等)

于 2012-04-30T16:23:46.423 回答