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);
}
4

1 回答 1

1

我的猜测是你永远不会破坏AppleEvent *对象。的文档AECreateAppleEvent说:

如果函数成功返回,您的应用程序应调用 AEDisposeDesc 函数以在完成使用后处理生成的 Apple 事件。

对此的一个线索是该函数中包含“创建”一词,这(根据创建规则)意味着您负责处理创建的内存。

(我想我应该在回答之前阅读所有发布的代码)

由于您似乎正确地处理了东西,我会在您的代码上运行 Leaks 工具并确定实际泄漏的内容。

此外,正如@DarkDust 指出的那样,您应该真正阅读Cocoa Naming Conventions文档。

于 2010-10-03T15:46:05.170 回答