Может ли Xcode сказать мне, если я забуду включить реализацию категории в мою цель?

У меня есть категория, которую я импортирую в.m таким образом:

#import "UIView+Additions.h"

Если я забуду добавить UIView+Additions.m до моей цели, я не буду знать до тех пор, пока среда выполнения не сможет найти мой селектор. Есть ли способ узнать во время компиляции (или, возможно, во время компоновки), что я забыл включить реализацию категории?

1 ответ

Решение

Этот макрос работает!

#ifndef HJBObjCCategory_h
#define HJBObjCCategory_h

#define HJBObjCCategoryInterface( c , n ) \
\
extern int c##n##Canary; \
\
__attribute__((constructor)) static void c##n##CanaryCage() { \
    c##n##Canary = 0; \
} \
\
@interface c (n)

#define HJBObjCCategoryImplementation( c , n ) \
\
int c##n##Canary = 0; \
\
@implementation c ( n )

#endif

Используйте это так:

UIView + Additions.h

HJBObjCCategoryInterface(UIView, Additions)

- (void)hjb_foo;

@end

UIView + Additions.m

HJBObjCCategoryImplementation(UIView, Additions)

- (void)hjb_foo {
  NSLog(@"foo!");
}

@end
Другие вопросы по тегам