Категория Objective-C, вызывающая нераспознанный селектор - PullRequest
67 голосов
/ 22 октября 2010

В моем проекте есть функция категории UIImage, которую я хочу вызвать из другого класса. Я правильно импортирую файл заголовка для категории изображений и получаю проект для компиляции без предупреждения.

Проблема в том, что при вызове функции категории UIImage я увидел нераспознанную ошибку селектора с NSInvalidArgumentException. Почему я вижу это, если все правильно связал?

#import <UIKit/UIKit.h>

@interface UIImage (DRShare)

+ (UIImage*) imageNamed:(NSString*)name;

@end


@implementation UIImage (DRShare)

+ (UIImage*) imageNamedDR:(NSString*)name{

    CGFloat s = 1.0f;
    if([[UIScreen mainScreen] respondsToSelector:@selector(scale)]){
        s = [[UIScreen mainScreen] scale];
    }

    NSString *path = [NSString stringWithFormat:@"%@%@%@.png",kImagesPath,name,s > 1 ? @"@2x":@""];
    return [UIImage imageWithContentsOfFile:DRBUNDLE(path)];
}

@end

файл, который вызывает его:

        backgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamedDR:@"Share Popup Background"]];

Возникло исключение:

2010-10-22 11:51:02.880 Stuff[11432:207] +[UIImage imageNamedDR:]: unrecognized selector sent to class 0x1f8e938
2010-10-22 11:51:02.883 Stuff[11432:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '+[UIImage imageNamedDR:]: unrecognized selector sent to class 0x1f8e938'
*** Call stack at first throw:
(
    0   CoreFoundation                      0x02e65b99 __exceptionPreprocess + 185
    1   libobjc.A.dylib                     0x02fb540e objc_exception_throw + 47
    2   CoreFoundation                      0x02e6776b +[NSObject(NSObject) doesNotRecognizeSelector:] + 187
    3   CoreFoundation                      0x02dd72b6 ___forwarding___ + 966
    4   CoreFoundation                      0x02dd6e72 _CF_forwarding_prep_0 + 50
    5   TapTapShare                         0x0001291c -[DRShareViewController backgroundView] + 127
    6   TapTapShare                         0x00012343 -[DRShareViewController loadView] + 639
    7   UIKit                               0x0044f54f -[UIViewController view] + 56
    8   UIKit                               0x0044d9f4 -[UIViewController contentScrollView] + 42
    9   UIKit                               0x0045d7e2 -[UINavigationController _computeAndApplyScrollContentInsetDeltaForViewController:] + 48
    10  UIKit                               0x0045bea3 -[UINavigationController _layoutViewController:] + 43
    11  UIKit                               0x0045d12d -[UINavigationController _startTransition:fromViewController:toViewController:] + 524
    12  UIKit                               0x00457ccd -[UINavigationController _startDeferredTransitionIfNeeded] + 266
    13  UIKit                               0x00574b55 -[UILayoutContainerView layoutSubviews] + 226
    14  QuartzCore                          0x02616481 -[CALayer layoutSublayers] + 177
    15  QuartzCore                          0x026161b1 CALayerLayoutIfNeeded + 220
    16  QuartzCore                          0x026160bd -[CALayer layoutIfNeeded] + 111

Ответы [ 7 ]

210 голосов
/ 22 октября 2010

Пара возможностей:

  1. Вы не связали UIImage+TTShare.m с вашей целью. Таким образом, пока у вас есть заголовок, вы не компилируете реализацию.
  2. Если это часть статической библиотеки, вам нужно добавить -all_load к настройке Other Linker Flags для приложения, связывающегося с библиотекой.
9 голосов
/ 28 апреля 2015

Если вы хотите использовать метод Category, вы должны добавить -ObjC к настройке сборки Other Linker Flags вашего приложения.

6 голосов
/ 11 марта 2013

У меня была та же проблема, и мне пришлось применить это исправление.Мой исходный файл NSDate-Extensions.m не компилировался, поэтому мне пришлось зайти в настройки проекта, затем выбрать соответствующую цель, затем щелкнуть вкладку «Фазы сборки», затем развернуть элементы «Исходники компиляции», затем нажать значок +и вручную добавьте мой файл NSDate-Extensions.m.

0 голосов
/ 11 ноября 2016

Может быть потому, что вы пишете imageNamed вместо imageNamedDR в интерфейсе ..

0 голосов
/ 02 сентября 2016

Еще одна возможность:

Это почти слишком неловко, чтобы признать, но на всякий случай кто-то мог совершить ту же глупую ошибку:

Я копировал код из одного проекта в другой,и по ошибке я вставил один и тот же исходный код в файл .h и файл .m (в оба я поместил код, предназначенный для файла .h).Я исправил мой .m файл, и он работал.

0 голосов
/ 27 августа 2015

Другая возможность.

У вас есть реализация категории, но нет интерфейса.Я имею в виду, что вы забыли объявить в * .h интерфейс вашей категории.

0 голосов
/ 09 апреля 2015

У меня было это сообщение об ошибке, и я использую Cocoapods.Чтобы исправить ошибку, мне просто нужно было снова вызвать pod install, чтобы правильно создать все необходимые ссылки.

...