如果上述答案对您不起作用,这可能是因为整个类都是私有的(包括它的标题)。这是使用一些运行时技巧的替代方法;您必须确保签名正确,但我们可以使用一些防御性编码来避免崩溃。
首先,除非您只调用一次,否则我会将代码包装在一个辅助方法中:
// 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()
调用替换它们。