gpt4 book ai didi

objective-c - 调用CFSocketSendData的EXC_BAD_ACCESS

转载 作者:行者123 更新时间:2023-12-03 11:53:18 26 4
gpt4 key购买 nike

我正在使用此类的实例将必需的值传递给用于发送Socket数据的函数:

@interface SsdpParameters : NSObject
{
CFDataRef msg;
CFDataRef addr;
CFSocketRef sock;
}

@property CFDataRef msg;
@property CFDataRef addr;
@property CFSocketRef sock;

@end

这是负责发送套接字数据的功能:
-(void)SendSsdpResponse:(id)parameters
{
SsdpParameters *params = parameters;
CFDataRef msg = (CFDataRef)params.msg;
CFDataRef addr = (CFDataRef)params.addr;
CFSocketRef sock = (CFSocketRef)params.sock;

CFSocketError err = CFSocketSendData (sock, addr, msg, 0); // Program received signal: "EXC_BAD_ACCESS".

if (err)
{
NSLog(@"Error sending Valid Response");
}
}

此函数设置套接字并在1秒钟的延迟后调用SendSsdpResponse:
- (void) sendValidResponses
{
NSMutableString *message = nil;
CFSocketRef sock = [self newSSDPSendSocket];
if(sock != nil)
{
struct sockaddr_in SSDPaddr;
memset(&SSDPaddr, 0, sizeof(SSDPaddr));
SSDPaddr.sin_family=AF_INET;
SSDPaddr.sin_addr.s_addr=inet_addr(SSDP_ADDRESS);
SSDPaddr.sin_port=htons(SSDP_PORT);

// Loop through list, sending SSDP
for (NSString *aKey in list)
{
message = [[NSMutableString alloc] initWithString:@"NOTIFY * HTTP/1.1\r\n"];

// Append more lines to message.

CFDataRef addr = CFDataCreate(NULL, (const UInt8*)&SSDPaddr, sizeof(SSDPaddr));
CFDataRef msg = CFDataCreate(NULL, (const UInt8*)[message UTF8String], [message lengthOfBytesUsingEncoding:NSUTF8StringEncoding]);

SsdpParameters *parameters = [[SsdpParameters alloc] init];
parameters.msg = msg;
parameters.addr = addr;
parameters.sock = sock;

[self performSelector:@selector(SendSsdpResponse:) withObject:parameters afterDelay:1.0];

CFRelease(addr);
CFRelease(msg);
[message release];
}

CFRelease(sock);
}
}

从注释中可以看到,在SendSsdpResponse中,尝试调用CFSendSocketData时出现“EXC_BAD_ACCESS”错误。我怀疑这是因为我正在“传递” sockaddrmsg,并且运行时对此不满意。在将CF数据类型的变量传递给其他函数之前,我已经遇到了这个问题。我尚未找到答案,希望这里的人能最终帮助我了解幕后发生的事情。

谢谢!

最佳答案

EXC_BAD_ACCESS错误通常表明您正在尝试在已经释放的实例上调用方法。当您无法正确使用retain变量时,尤其是在函数之间传递变量时,通常会出现这种情况。

当您延迟执行选择器时,在此行上:

[self performSelector:@selector(SendSsdpResponse:) withObject:parameters afterDelay:1.0];

您正在为该方法提供 parameters变量,该变量具有您提供的 header 中定义的属性。问题在于,在 performSelector:方法之后,您将释放引用到 addrmsg的内存。由于要延迟执行此选择器,因此在使用之前, 将addr和msg指向的内存进行释放。

因此,一旦释放了此内存,它在SsdpParameters对象中就不再是“好”的了。您应该(在这些属性的 setter 中,在SsdpParameters对象上)复制此内存,以便原始调用者可以安全地释放它。

您应该研究此功能:
CFDataRef CFDataCreateCopy (
CFAllocatorRef allocator,
CFDataRef theData
);

然后,您的二传手可能看起来像:
@implementation SsdpParameters

...

- (void)setMsg:(CFDataRef)m {
// You should also release msg if it already exists
msg = CFDataCreateCopy(CFAllocatorGetDefault(), m);
}

...

@end

关于objective-c - 调用CFSocketSendData的EXC_BAD_ACCESS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8346355/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com