ObjectiveC类别未导入但仍在运行代码

nul*_*fox 14 objective-c ios

我使用以下代码为UINavigationBar创建了一个类别:

// UINavigationBar+MyNavigationBar.m
@interface UINavigationBar (MyNavigationBar)

@end

@implementation UINavigationBar (MyNavigationBar)

- (void)drawRect:(CGRect)rect
{
    UIImage *img = [UIImage imageNamed: @"header.png"];
    [img drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];
}

@end
Run Code Online (Sandbox Code Playgroud)

我没有在任何地方#import,在我的整个项目的任何代码中,但是,此类别仍在运行并插入标题图形.这怎么可能?

Ken*_*ker 25

因为您在编译时将代码包含在应用程序中.#import只是使当前上下文(.h.m)知道该类别中的方法.

在您的应用运行时,将始终加载编译到您的应用中的任何类别.

要删除要添加到目标中的类别,请从应用中删除类别.m文件Target->Build Phase->Compile Sources.

假设您希望某些导航栏使用此代码,但不是所有这些代码,最好的方法是将UINavigationBar子类化.([super drawRect:rect]顺便说一下,你想调用你的子类)

编辑:将图像添加到UINavigationBar的替代方法,

在任何视图控制器中,您希望图像显示,只需添加self.navigationItem.titleView = [[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"header.png"]] autorelease];viewWillAppear:

  • "在你的应用程序运行时,任何编译到你应用程序中的类别都会被加载." 很高兴知道,谢谢! (2认同)