Ошибка "Передача адреса нелокального объекта в параметр __автореализации для обратной записи"
Я конвертирую свой сокет-клиент в 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];
Любая помощь?
Ответы
Ответ 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. Но обратите внимание: я не могу проверить это здесь.