错误"将非本地对象的地址传递给__autoreleasing参数以进行回写"

kil*_*anc 28 cocoa objective-c

我正在将我的套接字客户端转换为ARC:

- (id)initWithHostname:(NSString *)hostname AndPort:(NSInteger)port
{
    if((self = [super init]))
    {
        oBuffer = [[NSMutableData alloc] init];
        iBuffer = [[NSMutableData alloc] init];

        iStream = [[NSInputStream alloc] init];
        oStream = [[NSOutputStream alloc] init];

        [NSStream getStreamsToHost:[NSHost hostWithName:hostname] port:port inputStream:&iStream outputStream:&oStream];

        ...
    }

    return self;
}
Run Code Online (Sandbox Code Playgroud)

我得到的错误是:

file://localhost /...foo.m:错误:自动引用计数问题:将非本地对象的地址传递给__autoreleasing参数以进行回写

在"&iStream"/"&oStream"的这一行

[NSStream getStreamsToHost:[NSHost hostWithName:hostname] port:port inputStream:&iStream outputStream:&oStream];
Run Code Online (Sandbox Code Playgroud)

有帮助吗?

慭慭流*_*慭流觞 39

这个错误通常是由于非局部变量地址被传递给一个方法.因为该变量被声明为__strong默认,而该方法的参数是__autoreleasing,所以声明调用方法的参数为__strong,如下所示:__strong
注意头文件(.h文件)中的方法必须声明为与.m文件相同


Man*_*ann 15

创建两个局部变量,将它们的地址传递给方法,然后在返回后将其值分配给ivars.


Rud*_*uis 12

我认为你不应该分配和初始化iStream和oStream变量.他们打算收到.如果没有ARC,这只会造成两个未被注意的内存泄漏.现在你的编译器使用ARC然后它确实很重要.接收变量应该是本地的:

所以尝试:

    NSInputStream *iStream;
    NSOutputStream *oStream;

    oBuffer = [[NSMutableData alloc] init];
    iBuffer = [[NSMutableData alloc] init];

    [NSStream getStreamsToHost:[NSHost hostWithName:hostname] port:port inputStream:&iStream outputStream:&oStream];
Run Code Online (Sandbox Code Playgroud)

那应该有用,AFAICT.但请注意:我无法在此测试.

  • 我想说一个更好的答案是:http://stackoverflow.com/a/8829294/908621 (3认同)