Подтвердить что ты не робот

Ошибка "Передача адреса нелокального объекта в параметр __автореализации для обратной записи"

Я конвертирую свой сокет-клиент в 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;
}

Я получил ошибку:

error: Automatic Reference Counting Issue: Passing address of non-local object to __autoreleasing parameter for write-back

в этой строке на &iStream и &oStream:

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

Любая помощь?

4b9b3361

Ответ 1

Эта ошибка обычно происходит из-за того, что адрес нелокальной переменной передается методу. Поскольку переменная по умолчанию объявлена как __strong, а параметр метода - __autoreleasing, объявите параметр метода, вызванного как __strong, например: -(void)method:(id * __strong *)param.

Обратите внимание, что метод в заголовочном файле (файл .h) должен быть объявлен как тот же, что и в файле .m.

Ответ 2

Создайте две локальные переменные, передайте их адреса методу, затем присвойте их значения ivars после его возврата.

Ответ 3

Я думаю, вам не следует выделять и инициализировать переменные 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];

Это должно работать, AFAICT. Но обратите внимание: я не могу проверить это здесь.