iOS 类别一直加载

iOS Category loaded all the time

只有当 vc 出现在另一个 vc 上时,我才有支持肖像的类别。要使用它,通常我们使用 import UINavigationController+Portrait.h。但是,当我尝试调用另一个 vc 时,虽然我还没有导入,但 supportedInterfaceOrientations 总是在我的类别中调用。我可以知道哪里出了问题吗?

#import "UINavigationController+Portrait.h"

@implementation UINavigationController (Portrait)

- (BOOL)shouldAutorotate
{
    return NO;
}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
    return UIInterfaceOrientationPortrait;
}

- (NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskPortrait;
}

//ios4 and ios5
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return NO;
}

当您在 Objective-C 中创建类别时,您定义的任何方法都会影响 class 类别创建的每个实例 – 它不仅在您导入的文件中生效类别。

Objective-C 运行时是动态的,这意味着当您调用一个方法时,它会在适当的 class 上查找该方法并调用它。当您通过类别覆盖该方法时,即使没有将其导入任何地方,运行时也会寻找正确的方法来调用并发现类别中定义的方法可用,然后调用它。

这就是 UIViewController 的所有实例现在都找到您的类别的方法的原因。

因此,覆盖类别中的方法非常危险。相反,正确的做法是 subclass a class 并在那里覆盖它的方法。如果那不是一个选项,method swizzling 是另一种方法,但这也有其自身的风险。