2010-10-03 1 views
0

У меня есть утечка памяти в этом коде. Я разоряю его с 2 недель, и я начинаю сходить с ума. Заранее спасибо за помощь :)Где утечка?

+(void) makeEvent:(int) event:(AppleEvent *)theEvent 
{ 
    int sig = 'dock'; 
    OSErr err; 
    AEAddressDesc targetDesc; 

    targetDesc.descriptorType = typeNull; 
    targetDesc.dataHandle = nil; 

    err = AECreateDesc(
        typeApplSignature, 
        &sig, sizeof(int), 
        &targetDesc 
        ); 
    if(err) { NSLog(@"Error creating descriptor: %i\n", err); } 

    err = AECreateAppleEvent(
         'DKoP', event, 
         &targetDesc, 
         kAutoGenerateReturnID, kAnyTransactionID, 
         theEvent 
         ); 
    if(err) { NSLog(@"Error creating event: %i\n", err); } 

    AEDisposeDesc(&targetDesc); 
    targetDesc.descriptorType = typeNull; 
    targetDesc.dataHandle = nil; 
} 

addIntParm сообщение:

+(void) addIntParm:(int) parm: (int) keyword: (AppleEvent *)theEvent 
{ 
    OSErr err = AEPutParamPtr(
           theEvent, keyword, 
           typeSInt32, &parm, sizeof(parm) 
          ); 
    if(err) { NSLog(@"Error setting parameter: %i\n", err); } 
} 

addFloatParm сообщение:

+(void) addFloatParm:(float) parm: (int) keyword: (AppleEvent *)theEvent 
{ 
    OSErr err = AEPutParamPtr(
           theEvent, keyword, 
           typeIEEE32BitFloatingPoint, &parm, sizeof(parm) 
          ); 
    if(err) { NSLog(@"Error setting parameter: %i\n", err); } 
} 

sendEvent сообщение:

+(void) sendEvent:(AppleEvent *)theEvent 
{ 
    OSErr err = AESend(
         theEvent, nil, kAENoReply, //kAEWaitReply 
         kAENormalPriority, kNoTimeOut, 
         nil, nil 
         ); 
    if(err) { NSLog(@"Error sending: %i\n", err); } 
} 

Test сообщение:

+ (void) Test:(int)wid:(int)w:(int)h:(void*)points 
{ 
    AppleEvent theEvent; 
    [self makeEvent:'warp' :&theEvent]; 
    [self addIntParm:wid :'wnid' :&theEvent]; 
    [self addIntParm:w :'wwrp' :&theEvent]; 
    [self addIntParm:h :'hwrp' :&theEvent]; 
    [self addDataParm:points :sizeof(float)*4*h*w :'pots' :&theEvent]; 
    [self sendEvent:&theEvent]; 
    AEDisposeDesc(&theEvent); 
} 
+1

Не заметили утечку, но у вас возник вопрос: почему вы делаете такие странные вещи с именами ваших методов? Я имею в виду, что ваши методы называются 'Test ::::' и 'addFloatParm :::' ... почему? Кроме того, что говорят инструменты? – DarkDust

+1

Вы попробовали инструмент [Утечки] (http://mobileorchard.com/find-iphone-memory-leaks-a-leaks-tool-tutorial/)? – Zamboni

+0

Я новичок в программировании какао. Я буду читать соглашения об именах какао. –

ответ

1

Я думаю, что вы никогда не разрушив AppleEvent * объект. Документация AECreateAppleEvent говорит:

Если функция завершается успешно, приложение должно вызвать функцию AEDisposeDesc распоряжаться полученным событие Apple, после того, как он закончит работу с ним.

Ключ к этому заключается в том, что функция имеет в нем слово «Создать», которое ( according to the Create Rule) означает, что вы несете ответственность за удаление созданной памяти.

(Думаю, я должен прочитать весь размещенный код, прежде чем ответить)

Так как кажется, вы правильно утилизация материала, я бы запустить Утечки инструмента на свой код и определить, что фактически протекает.

Кроме того, как указывает @DarkDust, вы должны действительно прочитать документацию Cocoa Naming Conventions.

+0

Спасибо за вашу помощь. Фактически я распоряжаюсь им (последняя строка функции тестирования) –