【问题标题】:cast of objective-c pointer type nsoutputstream* to c pointer type cfwritestreamref exception after __bridge在 __bridge 之后将 Objective-c 指针类型 nsoutputstream* 转换为 c 指针类型 cfwritestreamref 异常
【发布时间】:2012-10-24 07:50:40
【问题描述】:

我正在开发一个使用 smtp 发送照片的项目。一开始,自动引用计数被禁用,项目运行没有问题。当我启用自动引用计数时,我遇到了很多编译错误。最常见的一种是在行中将 Objective-C 指针类型“NSOutputStream*”转换为 C 指针类型 CFWriteStreamRef(又名“struct_CFWriteStream*”需要桥接转换)

if (CFWriteStreamWriteFully(( CFWriteStreamRef)outputStream, (const uint8_t *)[ehlo  
UTF8String], [ehlo lengthOfBytesUsingEncoding:NSUTF8StringEncoding]) < 0)                       

当我写 if (CFWriteStreamWriteFully((__bridge CFWriteStreamRef)outputStream, (const uint8_t *)
[ehlo UTF8String], [ehlo lengthOfBytesUsingEncoding:NSUTF8StringEncoding])

它可以编译,但是当我按下发送按钮以使用 smtp 发送电子邮件时出现运行时异常。我想知道你是否可以帮助我解决这个问题。我将不胜感激任何帮助。提前谢谢你,最好的问候

【问题讨论】:

    标签: objective-c automatic-ref-counting


    【解决方案1】:

    你如何确定这是一个错误的类型转换? 只要流正在写入,请尝试保留 [ehlo UTF8String] 的所有权,也许这会有所帮助

    const UInt8 *buffer = (const UInt8 *)[ehlo UTF8String];
    if (CFWriteStreamWriteFully(( CFWriteStreamRef)outputStream, buffer, [ehlo lengthOfBytesUsingEncoding:NSUTF8StringEncoding]) < 0) 
    

    顺便说一句,我在任何地方都没有找到 CFWriteStreamWriteFully() 声明。只有 CFIndex

    CFWriteStreamWrite (
       CFWriteStreamRef stream,
       const UInt8 *buffer,
       CFIndex bufferLength
    );
    

    有关系吗? UInt8 和 uint8_t 都是无符号字符。

    【讨论】:

    • 非常感谢您的帮助。但是我试过了,它没有用。代码如下: if (CFWriteStreamWriteFully((CFWriteStreamRef)outputStream, const uint8_t *)[ehlo UTF8String], [ehlo lengthOfBytesUsingEncoding:NSUTF8StringEncoding])
    • CFIndex CFWriteStreamWriteFully(CFWriteStreamRef outputStream, const uint8_t* buffer, CFIndex length) { CFIndex bufferOffset = 0; CFIndex bytesWritten; while (bufferOffset
    • bufferOffset += bytesWritten; } else if (CFWriteStreamGetStatus(outputStream) ==kCFStreamStatusError) return -1; } else { // 泵送运行循环 CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0.0, true); } } 返回缓冲区偏移; } [self startShortWatchdog]; }
    • 好的,那么你应该显示你的堆栈错误,它会更简单。然后我们可以看到错误实际发生在哪里
    • 异常发生在以下行: if CFWriteStreamWriteFully(( CFWriteStreamRefoutputStream, (const uint8_t *)[ehlo UTF8String], [ehlo lengthOfBytesUsingEncoding:NSUTF8StringEncoding])
    猜你喜欢
    • 2021-09-20
    • 1970-01-01
    • 2017-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-24
    • 1970-01-01
    相关资源
    最近更新 更多