Линкер не может найти класс, который должен быть там - PullRequest
2 голосов
/ 25 ноября 2010

У меня есть проект, который использует платформу Core Telephony.Недавно мой код перестал работать в категории CTCarrier, компоновщик жалуется, что не может найти класс CTCarrier:

Undefined symbols:
  "_OBJC_CLASS_$_CTCarrier", referenced from:
      l_OBJC_$_CATEGORY_CTCarrier_$_Foo in CTTests.o
ld: symbol(s) not found

Это пример кода, который вызывает ошибку выше:

#import <CoreTelephony/CTCarrier.h>

@interface CTCarrier (Foo)
- (void) doFoo;
@end

@implementation CTCarrier (Foo)
- (void) doFoo {}
@end

Если я изменю категорию на расширение класса, код неожиданно создаст:

#import <CoreTelephony/CTCarrier.h>

@interface CTCarrier ()
- (void) doFoo;
@end

@implementation CTCarrier
- (void) doFoo {}
@end

Что происходит?Пример кода на GitHub .

Ответы [ 2 ]

1 голос
/ 11 января 2011

В 4.2 есть ошибка, которая не позволяет напрямую создать объект CTCarrier, правильный способ доступа к CTCarrier - через объект CTTelephonyNetworkInfo, например:

#import <CoreTelephony/CTTelephonyNetworkInfo.h>
#import <CoreTelephony/CTCarrier.h>

CTTelephonyNetworkInfo *telephony = [[CTTelephonyNetworkInfo alloc] init];
CTCarrier *carrier = telephony.subscriberCellularProvider;
[telephony release];
0 голосов
/ 25 ноября 2010

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

...