Как распознать нераспознанный селектор, отправленный в класс? - PullRequest
2 голосов
/ 22 июля 2010

Мой вопрос похож на Этот ТАК вопрос , но главное отличие в том, что я использую методы класса. Какой-то код:

OpenFeint + private.h

@interface OpenFeint (Private)
// ...
+ (void) createSharedInstance;

OpenFeint + private.mm

+ (void) createSharedInstance
{
   //...
}

OpenFeint.mm

+ (void) initializeWithProductKey:(NSString*)productKey 
       andSecret:(NSString*)productSecret 
       andDisplayName:(NSString*)displayName
       andSettings:(NSDictionary*)settings 
       andDelegates:(OFDelegatesContainer*)delegatesContainer
{
    [OpenFeint createSharedInstance];
    // ...

MyApp.mm:

// ...
#import "OpenFeint.h"
// ...
[OpenFeint initializeWithProductKey: OF_PRODUCT_KEY 
        andSecret: OF_PRODUCT_SECRET
        andDisplayName: OF_DISPLAY_NAME
        andSettings: openFeintSettings
        andDelegates: [OFDelegatesContainer containerWithOpenFeintDelegate: self]];

И ошибка:

2010-07-22 11:30:15.239 MyApp[20210:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '+[OpenFeint createSharedInstance]: unrecognized selector sent to class 0x1cdb1c'
*** Call stack at first throw:
(
    0   CoreFoundation                      0x02d6f919 __exceptionPreprocess + 185
    1   libobjc.A.dylib                     0x02ebd5de objc_exception_throw + 47
    2   CoreFoundation                      0x02d714eb +[NSObject(NSObject) doesNotRecognizeSelector:] + 187
    3   CoreFoundation                      0x02ce1116 ___forwarding___ + 966
    4   CoreFoundation                      0x02ce0cd2 _CF_forwarding_prep_0 + 50
    5   MyApp                               0x0002844d +[OpenFeint initializeWithProductKey:andSecret:andDisplayName:andSettings:andDelegates:] + 48
        // ...

Все отлично компилируется и ссылки, но я получаю эту глупую ошибку.

И последнее. Все, что есть в OpenFeint, - это статическая библиотека, и да, она также скомпилирована и связана. Это моя первая статическая библиотека, поэтому я, скорее всего, пропускаю какой-то важный шаг. Любые подсказки?

Спасибо!

Ответы [ 2 ]

7 голосов
/ 22 июля 2010

Хм, кажется, нашел обходной путь , но я не уверен, что это правильное исправление. Я добавил флаг компоновщика -all_load (в дополнение к -ObjC), и теперь, похоже, все работает.

Исправление вопроса / дополнение: это «законное» исправление? Есть ли лучший?

2 голосов
/ 23 июля 2010

OpenFeint + private - это категория, поэтому, если вы не импортируете файл OpenFeint + private.h везде, где вы его вызываете, вы будете получать ошибку selector not recognized каждый раз, когда вызываете его. Это как если бы вы никогда не определяли метод вообще.

...