Категория ObjectiveC не импортирована, но все еще выполняется код

#objective-c #ios

#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
  

Однако у меня нет #import нигде, ни в одном коде во всем моем проекте, эта категория все еще запущена и вставляет графический заголовок. Как это возможно?

Ответ №1:

Потому что вы включаете код в свое приложение при его компиляции. #import просто делает текущий контекст ( .h или .m ) осведомленным о методах в этой категории.

Любая категория, скомпилированная в ваше приложение, будет загружаться все время, пока ваше приложение работает.

Чтобы удалить категорию из добавления в вашу цель, удалите файл category .m из вашего приложения Target->Build Phase->Compile Sources .

Предполагая, что вы хотите, чтобы НЕКОТОРЫЕ из ваших панелей навигации использовали этот код, но не ВСЕ из них, лучший способ сделать это, вероятно, подкласс UINavigationBar . (Кстати, вы захотите вызвать [super drawRect:rect] свой подкласс)

Редактировать: альтернативный метод добавления изображения в UINavigationBar,

В любом контроллере представления, который вы хотите отобразить, просто добавьте self.navigationItem.titleView = [[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"header.png"]] autorelease]; в viewWillAppear:

Комментарии:

1. «Любая категория, скомпилированная в ваше приложение, будет загружаться все время, пока ваше приложение работает». Приятно знать, спасибо!