ObjC: приведение косвенного указателя к указателю Objective C - PullRequest
0 голосов
/ 13 декабря 2011

Как я могу изменить следующий код для совместимости с ARC:

MyObj* fn = nil;
[self performSelectorOnMainThread:@selector(popSomething:) withObject:(id)&fn waitUntilDone:YES];

Прямо сейчас я получаю следующую ошибку:

error: cast of an indirect pointer to an Objective-C pointer to '__strong id' is disallowed with ARC [4]

Ответы [ 2 ]

2 голосов
/ 13 декабря 2011

Если вы ожидаете, что основной поток обновит строку, то лучший способ сделать это - использовать изменяемую строку и просто передать ее в основной поток:

NSMutableString* fn = [NSMutableString string];
[self performSelectorOnMainThread:@selector(queuedFileNamesPop:) withObject:fn waitUntilDone:YES];

Тогда основной поток может просто обновить строку.

0 голосов
/ 13 декабря 2011

Тип аргумента должен быть (id *), т.е. указатель на объект, а не объект.

Но если вы просто хотите вернуть значение из метода, который вам нужно выполнить в главном потоке, лучше использовать блоки и GCD:

__block id poppedFilename;
dispatch_sync(dispatch_get_main_queue(), ^{
     poppedFilename = [self popFilename];
});
// do something with the popped file

Выполняет метод -popFilename в главном потоке и сохраняет результат в poppedFilename. Вы должны быть осторожны, чтобы не вызывать этот метод в главном потоке, так как это может привести к тупику. Если вы не уверены, что находитесь в главном потоке, вы можете использовать что-то вроде этого:

__block id poppedFilename;
if ([NSThread isMainThread]) {
     poppedFilename = [self popFilename];
} else {
     dispatch_sync(dispatch_get_main_queue(), ^{
         poppedFilename = [self popFilename];
     });
}
...