Если приведенный выше ответ не работает для вас, это может быть потому, что весь класс является закрытым (включая его заголовок).Вот альтернативный подход, использующий некоторые хитрости во время выполнения;Вы должны быть уверены, что подпись верна, но мы можем использовать некоторое защитное кодирование, чтобы избежать сбоя.
Во-первых, если вы не вызываете это только один раз, я бы завернул код в вспомогательный метод:1003 *
// in some header file, you may want to give the method a prefix too
CLLocation *ApplyLocationManagerChinaLocationShift(CLLocation *newLocation);
Теперь вы можете использовать NSClassFromString
для получения ссылки на класс и performSelector
для выполнения метода.Мы можем сначала попытаться убедиться, что метод существует, чтобы быть в безопасности:
CLLocation *ApplyLocationManagerChinaLocationShift(CLLocation *newLocation)
{
id sharedLocationManager = [NSClassFromString(@"MKLocationManager") performSelector:@selector(sharedLocationManager)];
SEL theSelector = @selector(_applyChinaLocationShift:);
// this will ensure sharedLocationManager is non-nil and responds appropriately
if (![sharedLocationManager respondsToSelector:theSelector]) {
return nil; // fail silently - check this in the caller
}
return [sharedLocationManager performSelector:theSelector withObject:newLocation];
}
Я не запускал приведенный выше код, но он должен сработать.Если по какой-то причине вызовы @selector()
не работают (я думаю, что они должны), то вы можете заменить их на вызовы NSSelectorFromString()
.