2012-04-30 1 views
1

이 문제와 관련하여 많은 게시물을 보내 주셔서 진심으로 감사드립니다.콜백 중에 아무 것도 할 수 있습니까? 기본 목표 C 이슈

나는 C로되어 있고 새로운 버퍼가 도착할 때 콜백 함수를 가지고있다.

여기 콜백에서 malloc이 아닌 어떤 것도하지 말라고 들었습니다.

이제 새 버퍼를 다른 클래스 (원 버퍼를 만들고 많은 버퍼를 저장)로 보내려고합니다.

하지만, 내가 얻지 못하는 기본적인 것은 콜백에서 다른 함수를 호출하면됩니다. 그 기능을 DSP에서 수행하기 때문에 시간이 걸립니다. 그 콜백에서 그것을하는 것과 같습니다.

froof : 나는 다른 클래스의 다른 함수에 데이터를 보내고 그 ok를 시도하지만 거기에 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, 그것은 메모리 누수없이 작동 할 때. 콜백이 기다리고 있음을 의미합니다!

그 데이터를 다른 곳에서 병렬로 처리하는 방법은 무엇입니까? 지금은 일주일을 보내고 있습니다.

감사합니다.

+1

명확하게해야합니다. 누가 너 한테 아무것도하지 말라고 했어? 그리고 그들이 정말로 "무엇이든"이라고 말하면, 당신은 아무것도 할 수 없다면 콜백이 존재하지 않을 것이기 때문에 그들은 불쾌하게 부정확합니다. 알아 두어야 할 것은 콜백 컨텍스트에서 수행 할 수있는 작업의 세부 사항입니다. –

+0

콜백은 무엇입니까? – Dani

+0

또한, 메모에서 버퍼 데이터를 반복하는 방법이 아닙니다. 'sizeof'는 매개 변수 데이터 형식의 크기를 반환합니다. 서명 된 16 비트 정수에 대한 포인터의 크기를 묻습니다. 포인터가 가리키는 버퍼의 크기를 묻지 않습니다. 버퍼의 길이는 별도의 인수로 전달해야합니다. –

답변

1

NSLog에서 NSString과 같은 Objective-C 객체를 사용할 때 메모리 누수의 가능성 중 하나는 해당 객체가 자동 복구되거나 자동으로 사용 된 객체를 사용할 수 있다는 것입니다.

귀하의 콜백이 다른 스레드에서 호출되었을 수 있습니다. 콜백에 중단 점을 넣고 주 스레드 또는 보조 스레드 인 경우 디버거를보고 확인할 수 있습니다.

보조 스레드에는 자체 AutoRelease 풀이 있어야합니다. 시스템은 주 스레드에 대해 자동으로 시스템을 작성하지만 보조 스레드를 작성하려면 명시 적으로 시스템을 작성해야합니다.

또한 콜백에 물건을 할당하지 않은 한 가지 이유는 일반적으로 성능 때문입니다. 호출 된 스레드를 막지 않으려면 콜백을 최소한으로 유지해야하는 경우가 많습니다.

+1

감사하지만 이것은 이것과 아무런 관련이 없습니다. 내가 그랬더라도 : NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 똑같은 일이 일어난다. – user1280535

0

내가 추측해야만한다면 (아마도 내가 할 것 같아) 콜백은 인터럽트 컨텍스트에서 호출 될 것이므로 malloc 등은 치명적일 수 있습니다. 데이터를 버퍼에 복사 (예 : memcpy)하고 나중에 실행할 조건 (예 : 조건 변수, 실행 루프 소스 등)을 예약/신호 처리 코드로 예약합니다.

+0

이것은 좋은 해결책이지만이 일정을 피하려고합니다. 나는 nsnotification 센터를 사용하고 싶었다. – user1280535

1

C 자습서.

  • data=buffer; :이 data의 이전 값을 누수 우리가 정말 당신을 도울 수 코드 적어도 두 가지 문제가있다. 데이터 (memcpy)로 복사하거나 메모리를 먼저 해제하고 (free) 포인터를 유지해야합니다.버퍼가 콜백 이후에 범위를 벗어나지 않는 경우에만 복사 할 수 있습니다.
  • sizeof(data) :이 방법은 작동하지 않습니다. data은 포인터입니다. 그것은 두 번째는 당신이 이 제대로 적어도 더 자세한 정보없이 다시 전화를 구현할 수 있다는 것을 의미

에서 지적되는 데이터의 양을 알 수 없습니다. (버퍼에 데이터 양이 표시되거나 일정한 크기가 표시됩니다.)

+0

남겨주세요. 잊어 버려요. NSLog에 간단한 단어가 있더라도이 누수가 있습니다. 이것이 바로 여기서 쟁점이되는 것입니다. – user1280535