在回调期间可以做任何事情吗?基本目标c问题

时间:2012-04-30 16:03:48

标签: objective-c c remoteio

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

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

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

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

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

来自: 我正在将数据发送到另一个类中的另一个函数,并且没问题,但是如果我尝试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时,它可以在没有内存泄漏的情况下运行。 这意味着回调正在等待!

我如何并行处理其他数据? 我现在花了一个星期的时间。

感谢。

3 个答案:

答案 0 :(得分:1)

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

可以从其他线程调用您的回调。您可以通过在回调中放置断点并查看调试器来确认这是否是主线程或辅助线程。

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

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

答案 1 :(得分:1)

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

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

第二个意味着无法正确实现回调,至少在没有进一步信息的情况下。 (缓冲区有一些数据量的指示,或者它是一个恒定的大小。)

答案 2 :(得分:0)

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