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 是另一种方法,但这也有其自身的风险。
只有当 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 是另一种方法,但这也有其自身的风险。