使用Objective C将非本地对象的地址传递给_autoreleasing参数以便在SKPSMTPMessage.m中进行回写?

问题描述 投票:0回答:1

我是iOS新手,我使用SMTP服务器实现后台邮件,在与主项目集成时我得到(将非本地对象的地址传递给_autoreleasing参数进行回写)这个错误我不知道如何解决这个问题,我提到这个link实现后台邮件。我用过这个SMTP库link下面的行获取错误,

[NSStream getStreamsToHostNamed:relayHost port:relayPort inputStream:&inputStream outputStream:&outputStream];
ios objective-c email smtpclient smtplib
1个回答
0
投票

在ARC下,参数声明为:

SomeObjectType ** parameterName

具有__autoreleasing的隐式所有权限定符:

SomeObjectType * __autoreleasing * parameterName

这些参数是out参数,即它们从被调用的方法接收值而不是将值传递给被调用的方法,并且实际参数必须是局部变量的地址。这种机制称为pass-by-writeback。

错误消息告诉您,您传递的一个或两个地址不是局部变量的地址,即inputStreamoutputStream中的任何一个或两个都不是局部变量。

简单的解决方法是引入用于参数的局部变量,并在调用后将返回的值复制到非局部变量中:

NSInputStream *tempInputStream;
NSOutputStream *tempOutputStream;
[NSStream getStreamsToHostNamed:relayHost port:relayPort inputStream:&tempInputStream outputStream:&tempOutputStream];
// copy return values to non-local variables
inputStream = tempInputStream;
outputStream = tempOutputStream;

如果你想了解out参数只接受局部变量的原因,请阅读Apple的Clang文档中的Passing to an out parameter by writeback

HTH

© www.soinside.com 2019 - 2024. All rights reserved.